cleanup geo data

main
iOS 2 years ago
parent 8cd2a734e5
commit 17f27980c6

@ -61,5 +61,7 @@
"emoji-shortcodes",
"obsidian-banners",
"templater-obsidian",
"obsidian-kanban"
"obsidian-kanban",
"plugins-galore",
"obsidian-3d-graph"
]

@ -95,6 +95,6 @@
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 0.16523273475461206,
"scale": 0.1470305035890801,
"close": true
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,9 @@
{
"id": "obsidian-3d-graph",
"name": "3D Graph",
"version": "1.0.0",
"description": "A 3D Graph for Obsidian",
"author": "Alexander Weichart",
"authorUrl": "https://github.com/AlexW00",
"isDesktopOnly": false
}

@ -0,0 +1,57 @@
.graph-3d-view .tree-item.is-collapsed > .tree-item-children {
display: none;
visibility: hidden;
}
.graph-3d-view {
padding: 0 !important;
position: relative;
overflow: hidden !important;
}
.graph-3d-view .graph-controls.is-collapsed > .graph-control-section {
display: none;
visibility: hidden;
}
.graph-3d-view .graph-controls:hover > .control-buttons {
opacity: 0.5;
}
.graph-3d-view .graph-controls > .control-buttons:hover {
opacity: 1;
}
.graph-3d-view .graph-controls > .control-buttons {
float: right;
margin-right: 0;
opacity: 0;
}
.graph-3d-view .hidden {
display: none;
visibility: hidden;
}
.graph-3d-view .control-buttons {
display: block;
}
.graph-3d-view .control-buttons > * {
display: inline-block;
margin: 0;
}
.graph-3d-view .graph-settings-view > .clickable-icon {
position: absolute;
top: 8px;
left: 8px;
}
.graph-3d-view .node-label {
color: var(--text-normal);
}
.graph-3d-view .scene-nav-info {
display: none;
visibility: hidden;
}

@ -12,8 +12,8 @@
"checkpointList": [
{
"path": "/",
"date": "2022-09-17",
"size": 7122665
"date": "2022-09-20",
"size": 7129893
}
],
"activityHistory": [
@ -1023,6 +1023,18 @@
{
"date": "2022-09-17",
"value": 1202
},
{
"date": "2022-09-18",
"value": 1974
},
{
"date": "2022-09-19",
"value": 2567
},
{
"date": "2022-09-20",
"value": 3285
}
]
}

@ -21,7 +21,7 @@
},
"02.01 London/Epsom Polo Club.md": {
"size": 1038,
"tags": 3,
"tags": 4,
"links": 2
},
"02.01 London/Khans.md": {
@ -1012,7 +1012,7 @@
"02.02 Paris/Guibine.md": {
"size": 954,
"tags": 3,
"links": 1
"links": 2
},
"02.02 Paris/Terrass'Hotel.md": {
"size": 1004,
@ -1161,7 +1161,7 @@
},
"02.02 Paris/Domaine de Courances.md": {
"size": 1018,
"tags": 4,
"tags": 5,
"links": 2
},
"02.02 Paris/@Media France.md": {
@ -1441,7 +1441,7 @@
},
"02.03 Zürich/Gestuet Homberg.md": {
"size": 1179,
"tags": 3,
"tags": 4,
"links": 3
},
"02.03 Zürich/@@Zürich.md": {
@ -1890,7 +1890,7 @@
"links": 16
},
"05.02 Networks/Server VPN.md": {
"size": 5053,
"size": 5649,
"tags": 4,
"links": 11
},
@ -1966,7 +1966,7 @@
},
"02.03 Zürich/Franzos.md": {
"size": 1069,
"tags": 1,
"tags": 2,
"links": 2
},
"02.03 Zürich/@Café Zürich.md": {
@ -1981,27 +1981,27 @@
},
"02.03 Zürich/Le Raymond Bar.md": {
"size": 1078,
"tags": 1,
"tags": 2,
"links": 4
},
"02.03 Zürich/Dante.md": {
"size": 1051,
"tags": 1,
"tags": 2,
"links": 4
},
"02.03 Zürich/Grande.md": {
"size": 1055,
"tags": 0,
"tags": 1,
"links": 4
},
"02.03 Zürich/La Stanza.md": {
"size": 1165,
"tags": 0,
"tags": 1,
"links": 3
},
"02.03 Zürich/Baur's.md": {
"size": 972,
"tags": 0,
"tags": 1,
"links": 2
},
"03.03 Food & Wine/Molletes.md": {
@ -2395,8 +2395,8 @@
"links": 0
},
"02.03 Zürich/La Baracca.md": {
"size": 1144,
"tags": 1,
"size": 1261,
"tags": 2,
"links": 2
},
"00.03 News/Nurses Have Finally Learned What Theyre Worth.md": {
@ -2480,18 +2480,18 @@
"links": 4
},
"02.03 Zürich/Bimi.md": {
"size": 1093,
"tags": 1,
"size": 1203,
"tags": 2,
"links": 2
},
"02.03 Zürich/Toto.md": {
"size": 1187,
"tags": 0,
"tags": 1,
"links": 2
},
"02.03 Zürich/Schluessel.md": {
"size": 1126,
"tags": 0,
"tags": 1,
"links": 2
},
"00.03 News/A Vibe Shift Is Coming.md": {
@ -2556,12 +2556,12 @@
},
"02.03 Zürich/Afghan Anar.md": {
"size": 1258,
"tags": 0,
"tags": 1,
"links": 2
},
"02.03 Zürich/Shilla.md": {
"size": 1075,
"tags": 0,
"tags": 1,
"links": 2
},
"00.03 News/As rents rise, Americans are stuck in homes even when they want to move.md": {
@ -3631,7 +3631,7 @@
},
"02.03 Zürich/Café des Amis.md": {
"size": 1200,
"tags": 1,
"tags": 2,
"links": 4
},
"00.01 Admin/Calendars/2022-04-16.md": {
@ -3641,7 +3641,7 @@
},
"02.03 Zürich/Cantinetta Antinori.md": {
"size": 1296,
"tags": 3,
"tags": 4,
"links": 4
},
"00.03 News/How an Ivy League School Turned Against a Student.md": {
@ -3981,12 +3981,12 @@
},
"02.02 Paris/Chez Robert.md": {
"size": 1226,
"tags": 2,
"tags": 3,
"links": 4
},
"02.02 Paris/Inavoué.md": {
"size": 1189,
"tags": 2,
"tags": 3,
"links": 4
},
"00.01 Admin/Calendars/2022-05-22.md": {
@ -4081,12 +4081,12 @@
},
"02.03 Zürich/La Réserve.md": {
"size": 1259,
"tags": 1,
"tags": 2,
"links": 2
},
"02.03 Zürich/No Idea.md": {
"size": 1173,
"tags": 1,
"tags": 2,
"links": 2
},
"00.01 Admin/Calendars/2022-05-30.md": {
@ -4466,7 +4466,7 @@
},
"02.03 Zürich/Ginger.md": {
"size": 1191,
"tags": 2,
"tags": 3,
"links": 4
},
"00.01 Admin/Calendars/2022-07-09.md": {
@ -4536,12 +4536,12 @@
},
"02.03 Zürich/Daizy.md": {
"size": 1202,
"tags": 2,
"tags": 3,
"links": 4
},
"02.03 Zürich/Modo.md": {
"size": 1204,
"tags": 1,
"tags": 2,
"links": 4
},
"00.01 Admin/Calendars/2022-07-17.md": {
@ -5231,12 +5231,12 @@
},
"02.03 Zürich/Dolder Grand.md": {
"size": 1159,
"tags": 2,
"tags": 3,
"links": 3
},
"02.03 Zürich/Bebek.md": {
"size": 1108,
"tags": 0,
"tags": 1,
"links": 4
},
"03.04 Cinematheque/Django (1966).md": {
@ -5251,17 +5251,17 @@
},
"02.03 Zürich/Le Mezzerie.md": {
"size": 1085,
"tags": 0,
"tags": 1,
"links": 2
},
"02.03 Zürich/Polo Park Zürich.md": {
"size": 1100,
"tags": 3,
"tags": 4,
"links": 2
},
"02.03 Zürich/Rosi.md": {
"size": 1104,
"tags": 0,
"tags": 1,
"links": 2
},
"00.03 News/The architect who became the king of bank robberies.md": {
@ -5351,7 +5351,7 @@
},
"02.03 Zürich/Luca2.md": {
"size": 1310,
"tags": 0,
"tags": 1,
"links": 2
},
"00.01 Admin/Calendars/2022-08-24.md": {
@ -5359,11 +5359,6 @@
"tags": 0,
"links": 7
},
"00.06 Professional/@Professional.md": {
"size": 1231,
"tags": 0,
"links": 1
},
"03.02 Travels/@Switzerland.md": {
"size": 1197,
"tags": 1,
@ -5496,11 +5491,11 @@
},
"02.03 Zürich/Monocle.md": {
"size": 1412,
"tags": 2,
"tags": 3,
"links": 2
},
"01.02 Home/League Tables.md": {
"size": 844,
"size": 755,
"tags": 0,
"links": 7
},
@ -5531,7 +5526,7 @@
},
"02.03 Zürich/Kiosk.md": {
"size": 1367,
"tags": 1,
"tags": 2,
"links": 3
},
"00.03 News/Was Vincent van Gogh Color Blind It Sure Looks Like It.md": {
@ -5740,23 +5735,18 @@
"links": 7
},
"02.03 Zürich/Francisco Podesta.md": {
"size": 1256,
"tags": 3,
"size": 1385,
"tags": 4,
"links": 2
},
"01.02 Home/Zürich - Practical infos.md": {
"size": 981,
"tags": 0,
"links": 5
},
"02.01 London/Callum Anderson.md": {
"size": 1213,
"tags": 2,
"tags": 3,
"links": 3
},
"02.01 London/Ryan Anderson.md": {
"size": 1223,
"tags": 2,
"tags": 3,
"links": 3
},
"00.01 Admin/Calendars/2023-09-08 Trip to NYC.md": {
@ -5792,15 +5782,55 @@
"00.01 Admin/Calendars/2022-09-17.md": {
"size": 1181,
"tags": 0,
"links": 9
},
"01.02 Home/Life - Practical infos.md": {
"size": 981,
"tags": 0,
"links": 5
},
"00.01 Admin/Calendars/2022-09-18.md": {
"size": 1196,
"tags": 0,
"links": 8
},
"00.01 Admin/Calendars/2022-09-18 Lyon - Paris SG (0-1).md": {
"size": 194,
"tags": 0,
"links": 2
},
"00.01 Admin/Calendars/2022-09-19.md": {
"size": 1136,
"tags": 0,
"links": 7
},
"00.06 Professional/@@Professional.md": {
"size": 1231,
"tags": 0,
"links": 1
},
"00.06 Professional/@Useful tools.md": {
"size": 936,
"tags": 2,
"links": 1
},
"00.01 Admin/Calendars/2022-09-20.md": {
"size": 1136,
"tags": 0,
"links": 8
},
"02.03 Zürich/Luigia.md": {
"size": 1341,
"tags": 3,
"links": 2
}
},
"commitTypes": {
"/": {
"Refactor": 837,
"Create": 881,
"Link": 1814,
"Expand": 812
"Refactor": 847,
"Create": 889,
"Link": 1867,
"Expand": 822
}
},
"dailyCommits": {
@ -5809,42 +5839,52 @@
"1": 22,
"2": 3,
"3": 9,
"4": 13,
"4": 16,
"5": 9,
"6": 55,
"7": 302,
"8": 420,
"9": 433,
"7": 305,
"8": 421,
"9": 434,
"10": 261,
"11": 221,
"11": 224,
"12": 176,
"13": 271,
"14": 226,
"13": 275,
"14": 234,
"15": 242,
"16": 194,
"17": 205,
"17": 210,
"18": 374,
"19": 193,
"20": 161,
"21": 141,
"22": 275,
"23": 75
"19": 195,
"20": 165,
"21": 143,
"22": 280,
"23": 115
}
},
"weeklyCommits": {
"/": {
"Mon": 677,
"Tue": 556,
"Mon": 691,
"Tue": 607,
"Wed": 585,
"Thu": 399,
"Fri": 431,
"Sat": 0,
"Sun": 1696
"Sun": 1712
}
},
"recentCommits": {
"/": {
"Expanded": [
"<a class=\"internal-link\" href=\"02.03 Zürich/Francisco Podesta.md\"> Francisco Podesta </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/La Baracca.md\"> La Baracca </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Bimi.md\"> Bimi </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Luigia.md\"> Luigia </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18.md\"> 2022-09-18 </a>",
"<a class=\"internal-link\" href=\"@Useful tools.md\"> @Useful tools </a>",
"<a class=\"internal-link\" href=\"@Useful tools.md\"> @Useful tools </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18 Lyon - Paris SG.md\"> 2022-09-18 Lyon - Paris SG </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18 Lyon - Paris SG.md\"> 2022-09-18 Lyon - Paris SG </a>",
"<a class=\"internal-link\" href=\"05.02 Networks/Server VPN.md\"> Server VPN </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-17.md\"> 2022-09-17 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-14 Weekend à GVA.md\"> 2022-10-14 Weekend à GVA </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-02-11 Mariage Eloi & Zélie.md\"> 2023-02-11 Mariage Eloi & Zélie </a>",
@ -5885,19 +5925,17 @@
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-21 Depart pour Paris.md\"> 2022-10-21 Depart pour Paris </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-14 🚆 Départ pour GVA.md\"> 2022-10-14 🚆 Départ pour GVA </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-16 Retour de GVA.md\"> 2022-10-16 Retour de GVA </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-14.md\"> 2022-09-14 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-21 Depart pour Paris.md\"> 2022-10-21 Depart pour Paris </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-23 Retour de Paris.md\"> 2022-10-23 Retour de Paris </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-30 🚆 Départ pour GVA.md\"> 2022-09-30 🚆 Départ pour GVA </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-02 Retour de GVA.md\"> 2022-10-02 Retour de GVA </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-12.md\"> 2022-09-12 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-13 Diner Lorena.md\"> 2022-09-13 Diner Lorena </a>",
"<a class=\"internal-link\" href=\"05.01 Computer setup/Apple processes.md\"> Apple processes </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-12.md\"> 2022-09-12 </a>",
"<a class=\"internal-link\" href=\"01.02 Home/Household.md\"> Household </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-06 PSG - Juventus (2-1).md\"> 2022-09-06 PSG - Juventus (2-1) </a>"
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-14.md\"> 2022-09-14 </a>"
],
"Created": [
"<a class=\"internal-link\" href=\"Untitled.md\"> Untitled </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-20.md\"> 2022-09-20 </a>",
"<a class=\"internal-link\" href=\"2022-09-20.md\"> 2022-09-20 </a>",
"<a class=\"internal-link\" href=\"Untitled.md\"> Untitled </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-19.md\"> 2022-09-19 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18 Lyon - Paris SG.md\"> 2022-09-18 Lyon - Paris SG </a>",
"<a class=\"internal-link\" href=\"00.05 Media/The Daily - How Queen Elizabeth II Preserved the Monarchy.md\"> The Daily - How Queen Elizabeth II Preserved the Monarchy </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18.md\"> 2022-09-18 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-17.md\"> 2022-09-17 </a>",
"<a class=\"internal-link\" href=\"2022-10-10.md\"> 2022-10-10 </a>",
"<a class=\"internal-link\" href=\"2023-09-08.md\"> 2023-09-08 </a>",
@ -5940,17 +5978,15 @@
"<a class=\"internal-link\" href=\"00.02 Inbox/Meghan of Montecito.md\"> Meghan of Montecito </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/U.K. braced for death of Queen Elizabeth II. It still came as a shock..md\"> U.K. braced for death of Queen Elizabeth II. It still came as a shock. </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-11.md\"> 2022-09-11 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-10.md\"> 2022-09-10 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-09.md\"> 2022-09-09 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Batman Robin (1997).md\"> Batman Robin (1997) </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-08.md\"> 2022-09-08 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-07.md\"> 2022-09-07 </a>",
"<a class=\"internal-link\" href=\"Untitled.md\"> Untitled </a>",
"<a class=\"internal-link\" href=\"Untitled.md\"> Untitled </a>",
"<a class=\"internal-link\" href=\"Untitled.md\"> Untitled </a>",
"<a class=\"internal-link\" href=\"Untitled.md\"> Untitled </a>"
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-10.md\"> 2022-09-10 </a>"
],
"Renamed": [
"<a class=\"internal-link\" href=\"02.03 Zürich/Luigia.md\"> Luigia </a>",
"<a class=\"internal-link\" href=\"00.06 Professional/@Useful tools.md\"> @Useful tools </a>",
"<a class=\"internal-link\" href=\"00.06 Professional/@@Professional.md\"> @@Professional </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18 Lyon - Paris SG (0-1).md\"> 2022-09-18 Lyon - Paris SG (0-1) </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18 ⚽ Lyon - Paris SG (0-1).md\"> 2022-09-18 ⚽ Lyon - Paris SG (0-1) </a>",
"<a class=\"internal-link\" href=\"01.02 Home/Life - Practical infos.md\"> Life - Practical infos </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-02-11 Mariage Eloi & Zélie.md\"> 2023-02-11 Mariage Eloi & Zélie </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-14 Weekend à GVA.md\"> 2022-10-14 Weekend à GVA </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-16 Weekend à GVA.md\"> 2022-10-16 Weekend à GVA </a>",
@ -5995,15 +6031,47 @@
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Men in Black 3 (2012).md\"> Men in Black 3 (2012) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Men in Black II (2002).md\"> Men in Black II (2002) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Men in Black (1997).md\"> Men in Black (1997) </a>",
"<a class=\"internal-link\" href=\"00.03 News/Was Vincent van Gogh Color Blind It Sure Looks Like It.md\"> Was Vincent van Gogh Color Blind It Sure Looks Like It </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Kiosk.md\"> Kiosk </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-03 Nantes - Paris SG (0-3).md\"> 2022-09-03 Nantes - Paris SG (0-3) </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-08-31 Toulouse - Paris SG (0-3).md\"> 2022-08-31 Toulouse - Paris SG (0-3) </a>",
"<a class=\"internal-link\" href=\"02.02 Paris/Paris SG.md\"> Paris SG </a>",
"<a class=\"internal-link\" href=\"01.02 Home/League Tables.md\"> League Tables </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Monocle.md\"> Monocle </a>"
"<a class=\"internal-link\" href=\"00.03 News/Was Vincent van Gogh Color Blind It Sure Looks Like It.md\"> Was Vincent van Gogh Color Blind It Sure Looks Like It </a>"
],
"Tagged": [
"<a class=\"internal-link\" href=\"02.01 London/Ryan Anderson.md\"> Ryan Anderson </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Polo Park Zürich.md\"> Polo Park Zürich </a>",
"<a class=\"internal-link\" href=\"02.02 Paris/Domaine de Courances.md\"> Domaine de Courances </a>",
"<a class=\"internal-link\" href=\"02.01 London/Callum Anderson.md\"> Callum Anderson </a>",
"<a class=\"internal-link\" href=\"02.01 London/Epsom Polo Club.md\"> Epsom Polo Club </a>",
"<a class=\"internal-link\" href=\"02.02 Paris/Chez Robert.md\"> Chez Robert </a>",
"<a class=\"internal-link\" href=\"02.02 Paris/Inavoué.md\"> Inavoué </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Toto.md\"> Toto </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Shilla.md\"> Shilla </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/No Idea.md\"> No Idea </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Le Raymond Bar.md\"> Le Raymond Bar </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Grande.md\"> Grande </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Luca2.md\"> Luca2 </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Luigia.md\"> Luigia </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Modo.md\"> Modo </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/La Baracca.md\"> La Baracca </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Rosi.md\"> Rosi </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Le Mezzerie.md\"> Le Mezzerie </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/La Stanza.md\"> La Stanza </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Kiosk.md\"> Kiosk </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Schluessel.md\"> Schluessel </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/La Réserve.md\"> La Réserve </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Daizy.md\"> Daizy </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Baur's.md\"> Baur's </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Café des Amis.md\"> Café des Amis </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Monocle.md\"> Monocle </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Afghan Anar.md\"> Afghan Anar </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Bebek.md\"> Bebek </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Dante.md\"> Dante </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Gestuet Homberg.md\"> Gestuet Homberg </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Cantinetta Antinori.md\"> Cantinetta Antinori </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Bimi.md\"> Bimi </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Ginger.md\"> Ginger </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Francisco Podesta.md\"> Francisco Podesta </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Franzos.md\"> Franzos </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Dolder Grand.md\"> Dolder Grand </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Luigia.md\"> Luigia </a>",
"<a class=\"internal-link\" href=\"@Useful tools.md\"> @Useful tools </a>",
"<a class=\"internal-link\" href=\"02.01 London/Ryan Anderson.md\"> Ryan Anderson </a>",
"<a class=\"internal-link\" href=\"Callum Anderson.md\"> Callum Anderson </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Francisco Podesta.md\"> Francisco Podesta </a>",
@ -6016,47 +6084,10 @@
"<a class=\"internal-link\" href=\"03.04 Cinematheque/TRON - Legacy (2010).md\"> TRON - Legacy (2010) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Avatar (2009).md\"> Avatar (2009) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Basic Instinct (1992).md\"> Basic Instinct (1992) </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Cowboy and Queen Elizabeth.md\"> The Cowboy and Queen Elizabeth </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Victim Who Became the Accused.md\"> The Victim Who Became the Accused </a>",
"<a class=\"internal-link\" href=\"00.03 News/Revolut chief Nikolay Storonsky We can still be bankings super app.md\"> Revolut chief Nikolay Storonsky We can still be bankings super app </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Victim Who Became the Accused.md\"> The Victim Who Became the Accused </a>",
"<a class=\"internal-link\" href=\"00.03 News/Meghan of Montecito.md\"> Meghan of Montecito </a>",
"<a class=\"internal-link\" href=\"00.03 News/Why Are Black Families Leaving Cities.md\"> Why Are Black Families Leaving Cities </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Second Elizabethan Age Has Ended.md\"> The Second Elizabethan Age Has Ended </a>",
"<a class=\"internal-link\" href=\"00.03 News/U.K. braced for death of Queen Elizabeth II. It still came as a shock..md\"> U.K. braced for death of Queen Elizabeth II. It still came as a shock. </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Batman Robin (1997).md\"> Batman Robin (1997) </a>",
"<a class=\"internal-link\" href=\"05.01 Computer setup/Apple processes.md\"> Apple processes </a>",
"<a class=\"internal-link\" href=\"06.02 Investments/Le Miel de Paris.md\"> Le Miel de Paris </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/The Lord of the Rings - The Return of the King (2003).md\"> The Lord of the Rings - The Return of the King (2003) </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Lord of the Rings - The Fellowship of the Ring (2001).md\"> The Lord of the Rings - The Fellowship of the Ring (2001) </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Lord of the Rings - The Two Towers (2002).md\"> The Lord of the Rings - The Two Towers (2002) </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Men in Black II (2002).md\"> Men in Black II (2002) </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Men in Black 3 (2012).md\"> Men in Black 3 (2012) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Men in Black (1997).md\"> Men in Black (1997) </a>",
"<a class=\"internal-link\" href=\"00.03 News/Was Vincent van Gogh Color Blind It Sure Looks Like It.md\"> Was Vincent van Gogh Color Blind It Sure Looks Like It </a>",
"<a class=\"internal-link\" href=\"Kiosk.md\"> Kiosk </a>",
"<a class=\"internal-link\" href=\"Paris SG.md\"> Paris SG </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Monocle.md\"> Monocle </a>",
"<a class=\"internal-link\" href=\"00.03 News/Extroverts destroy the world.md\"> Extroverts destroy the world </a>",
"<a class=\"internal-link\" href=\"05.01 Computer setup/Jellyfin.md\"> Jellyfin </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Test sheet.md\"> Test sheet </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Squid Game (2021).md\"> Squid Game (2021) </a>",
"<a class=\"internal-link\" href=\"00.03 News/Derinkuyu Mysterious underground city in Turkey found in mans basement.md\"> Derinkuyu Mysterious underground city in Turkey found in mans basement </a>",
"<a class=\"internal-link\" href=\"Shakshuka.md\"> Shakshuka </a>",
"<a class=\"internal-link\" href=\"00.03 News/Opinion Maternal Instinct Is a Myth That Men Created.md\"> Opinion Maternal Instinct Is a Myth That Men Created </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Deacon and the Dog City Journal.md\"> The Deacon and the Dog City Journal </a>",
"<a class=\"internal-link\" href=\"00.03 News/Why Dont Millennials Have Hobbies.md\"> Why Dont Millennials Have Hobbies </a>",
"<a class=\"internal-link\" href=\"00.03 News/Was King Arthur a Real Person.md\"> Was King Arthur a Real Person </a>",
"<a class=\"internal-link\" href=\"Mountain hikes in Switzerland.md\"> Mountain hikes in Switzerland </a>",
"<a class=\"internal-link\" href=\"Skiing in Switzerland.md\"> Skiing in Switzerland </a>",
"<a class=\"internal-link\" href=\"03.02 Travels/Geneva.md\"> Geneva </a>",
"<a class=\"internal-link\" href=\"Skiing in Switzerland.md\"> Skiing in Switzerland </a>",
"<a class=\"internal-link\" href=\"03.02 Travels/@Switzerland.md\"> @Switzerland </a>",
"<a class=\"internal-link\" href=\"03.03 Food & Wine/Pan-seared Seabream with vine leaf risotto.md\"> Pan-seared Seabream with vine leaf risotto </a>",
"<a class=\"internal-link\" href=\"Pan-seared Seabream with vine leaf risotto.md\"> Pan-seared Seabream with vine leaf risotto </a>",
"<a class=\"internal-link\" href=\"00.03 News/The messages that survived civilisation's collapse.md\"> The messages that survived civilisation's collapse </a>"
"<a class=\"internal-link\" href=\"00.03 News/The Cowboy and Queen Elizabeth.md\"> The Cowboy and Queen Elizabeth </a>"
],
"Refactored": [
"<a class=\"internal-link\" href=\"01.02 Home/League Tables.md\"> League Tables </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-03 Meggi leaving to Belfast.md\"> 2022-10-03 Meggi leaving to Belfast </a>",
"<a class=\"internal-link\" href=\"01.02 Home/Zürich - Practical info.md\"> Zürich - Practical info </a>",
"<a class=\"internal-link\" href=\"01.02 Home/Zürich - Practical info.md\"> Zürich - Practical info </a>",
@ -6106,10 +6137,11 @@
"<a class=\"internal-link\" href=\"02.03 Zürich/@Restaurants Zürich.md\"> @Restaurants Zürich </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-06-20.md\"> 2022-06-20 </a>",
"<a class=\"internal-link\" href=\"03.02 Travels/@France.md\"> @France </a>",
"<a class=\"internal-link\" href=\"03.02 Travels/Avignon.md\"> Avignon </a>",
"<a class=\"internal-link\" href=\"03.02 Travels/Bahrein.md\"> Bahrein </a>"
"<a class=\"internal-link\" href=\"03.02 Travels/Avignon.md\"> Avignon </a>"
],
"Deleted": [
"<a class=\"internal-link\" href=\"2022-09-20.md\"> 2022-09-20 </a>",
"<a class=\"internal-link\" href=\"00.05 Media/The Daily - How Queen Elizabeth II Preserved the Monarchy.md\"> The Daily - How Queen Elizabeth II Preserved the Monarchy </a>",
"<a class=\"internal-link\" href=\"2022-10-10.md\"> 2022-10-10 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-10 Return flight to Zürich.md\"> 2022-10-10 Return flight to Zürich </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-23 Retour de Paris.md\"> 2022-10-23 Retour de Paris </a>",
@ -6158,11 +6190,24 @@
"<a class=\"internal-link\" href=\"Media DB/Basquiat (1996).md\"> Basquiat (1996) </a>",
"<a class=\"internal-link\" href=\"Daily.md\"> Daily </a>",
"<a class=\"internal-link\" href=\"Life Progress.md\"> Life Progress </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Inside Putin's Anti-Semitic Turn.md\"> Inside Putin's Anti-Semitic Turn </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/403 Forbidden.md\"> 403 Forbidden </a>",
"<a class=\"internal-link\" href=\"2022-07-30.md\"> 2022-07-30 </a>"
"<a class=\"internal-link\" href=\"00.02 Inbox/Inside Putin's Anti-Semitic Turn.md\"> Inside Putin's Anti-Semitic Turn </a>"
],
"Linked": [
"<a class=\"internal-link\" href=\"02.02 Paris/Guibine.md\"> Guibine </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-20.md\"> 2022-09-20 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-20.md\"> 2022-09-20 </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Luigia.md\"> Luigia </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-20.md\"> 2022-09-20 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-19.md\"> 2022-09-19 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18.md\"> 2022-09-18 </a>",
"<a class=\"internal-link\" href=\"@Useful tools.md\"> @Useful tools </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-19.md\"> 2022-09-19 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-19.md\"> 2022-09-19 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18 Lyon - Paris SG.md\"> 2022-09-18 Lyon - Paris SG </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18 Lyon - Paris SG.md\"> 2022-09-18 Lyon - Paris SG </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18.md\"> 2022-09-18 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-17.md\"> 2022-09-17 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-18.md\"> 2022-09-18 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-17.md\"> 2022-09-17 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-17.md\"> 2022-09-17 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-17.md\"> 2022-09-17 </a>",
@ -6198,22 +6243,7 @@
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-30 🚆 Départ pour GVA.md\"> 2022-09-30 🚆 Départ pour GVA </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-02 Retour de GVA.md\"> 2022-10-02 Retour de GVA </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-14.md\"> 2022-09-14 </a>",
"<a class=\"internal-link\" href=\"00.03 News/Why Are Black Families Leaving Cities.md\"> Why Are Black Families Leaving Cities </a>",
"<a class=\"internal-link\" href=\"00.03 News/Revolut chief Nikolay Storonsky We can still be bankings super app.md\"> Revolut chief Nikolay Storonsky We can still be bankings super app </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/The Devil's Advocate (1997).md\"> The Devil's Advocate (1997) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/The Good the Bad and the Ugly (1966).md\"> The Good the Bad and the Ugly (1966) </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Godfather Part II (1974).md\"> The Godfather Part II (1974) </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Godfather Part III (1990).md\"> The Godfather Part III (1990) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/The Godfather (1972).md\"> The Godfather (1972) </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Dikkenek (2006).md\"> Dikkenek (2006) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/TRON - Legacy (2010).md\"> TRON - Legacy (2010) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Avatar (2009).md\"> Avatar (2009) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Basic Instinct (1992).md\"> Basic Instinct (1992) </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Cowboy and Queen Elizabeth.md\"> The Cowboy and Queen Elizabeth </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-12.md\"> 2022-09-12 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-13.md\"> 2022-09-13 </a>",
"<a class=\"internal-link\" href=\"00.03 News/U.K. braced for death of Queen Elizabeth II. It still came as a shock..md\"> U.K. braced for death of Queen Elizabeth II. It still came as a shock. </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Cowboy and Queen Elizabeth.md\"> The Cowboy and Queen Elizabeth </a>"
"<a class=\"internal-link\" href=\"00.03 News/Why Are Black Families Leaving Cities.md\"> Why Are Black Families Leaving Cities </a>"
],
"Removed Tags from": [
"<a class=\"internal-link\" href=\"06.02 Investments/Le Miel de Paris.md\"> Le Miel de Paris </a>",
@ -6252,7 +6282,8 @@
"<a class=\"internal-link\" href=\"05.02 Networks/Server Cloud.md\"> Server Cloud </a>",
"<a class=\"internal-link\" href=\"02.02 Paris/Paris SG.md\"> Paris SG </a>",
"<a class=\"internal-link\" href=\"01.02 Home/Zürich - Practical info.md\"> Zürich - Practical info </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-03 Meggi leaving to Belfast.md\"> 2022-10-03 Meggi leaving to Belfast </a>"
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-10-03 Meggi leaving to Belfast.md\"> 2022-10-03 Meggi leaving to Belfast </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-09-19.md\"> 2022-09-19 </a>"
]
}
},

File diff suppressed because one or more lines are too long

@ -1,7 +1,7 @@
{
"id": "obsidian-dice-roller",
"name": "Dice Roller",
"version": "8.6.6",
"version": "8.6.7",
"minAppVersion": "0.12.15",
"description": "Inline dice rolling for Obsidian.md",
"author": "Jeremy Valentine",

File diff suppressed because one or more lines are too long

@ -1,7 +1,7 @@
{
"id": "obsidian-kanban",
"name": "Kanban",
"version": "1.3.19",
"version": "1.3.20",
"minAppVersion": "0.15.3",
"description": "Create markdown-backed Kanban boards in Obsidian.",
"author": "mgmeyers",

File diff suppressed because one or more lines are too long

@ -21,7 +21,7 @@
}
},
{
"ruleName": "*Coffee",
"ruleName": "#Coffee",
"preset": false,
"iconDetails": {
"prefix": "fas",
@ -30,7 +30,7 @@
}
},
{
"ruleName": "*Investment",
"ruleName": "#Investment",
"preset": false,
"iconDetails": {
"prefix": "fas",
@ -39,7 +39,7 @@
}
},
{
"ruleName": "*Hotel",
"ruleName": "#Hotel",
"preset": false,
"iconDetails": {
"prefix": "fas",
@ -47,7 +47,7 @@
}
},
{
"ruleName": "*Restaurant",
"ruleName": "#Restaurant",
"preset": false,
"iconDetails": {
"prefix": "fas",
@ -56,7 +56,7 @@
}
},
{
"ruleName": "*Bar",
"ruleName": "#Bar",
"preset": false,
"iconDetails": {
"prefix": "fas",
@ -65,7 +65,7 @@
}
},
{
"ruleName": "*Sport",
"ruleName": "#Horse",
"preset": false,
"iconDetails": {
"prefix": "fas",
@ -74,13 +74,31 @@
}
},
{
"ruleName": "*Person",
"ruleName": "#Person",
"preset": false,
"iconDetails": {
"prefix": "fas",
"markerColor": "pink",
"icon": "fa-user-secret"
}
},
{
"ruleName": "#Service",
"preset": false,
"iconDetails": {
"prefix": "fas",
"markerColor": "yellow",
"icon": "fa-shop"
}
},
{
"ruleName": "#Football",
"preset": false,
"iconDetails": {
"prefix": "fas",
"markerColor": "green",
"icon": "fa-futbol"
}
}
],
"zoomOnGoFromNote": 15,
@ -103,6 +121,12 @@
"regExp": "https:\\/\\/www.openstreetmap.org\\S*query=([0-9\\.\\-]+%2C[0-9\\.\\-]+)\\S*",
"preset": true,
"ruleType": "latLng"
},
{
"name": "Generic Lat,Lng",
"regExp": "([0-9\\.\\-]+), ([0-9\\.\\-]+)",
"ruleType": "latLng",
"preset": true
}
],
"mapControls": {
@ -126,6 +150,7 @@
"chosenMapMode": "auto",
"saveHistory": true,
"letZoomBeyondMax": false,
"queryForFollowActiveNote": "path:\"$PATH$\"",
"tilesUrl": null,
"snippetLines": 3,
"darkMode": false,

@ -87,15 +87,15 @@
}
],
"05.02 Networks/Server VPN.md": [
{
"title": ":shield: [[Selfhosting]], [[Server VPN|VPN]]: Check VPN state & dashboard %%done_del%%",
"time": "2022-09-18",
"rowNumber": 292
},
{
"title": ":shield: [[Server VPN]]: Backup server %%done_del%%",
"time": "2022-10-04",
"rowNumber": 287
},
{
"title": ":shield: [[Selfhosting]], [[Server VPN|VPN]]: Check VPN state & dashboard %%done_del%%",
"time": "2022-12-18",
"rowNumber": 292
}
],
"04.01 lebv.org/Hosting Tasks.md": [
@ -341,25 +341,15 @@
}
],
"01.02 Home/Household.md": [
{
"title": ":bed: [[Household]] Change bedsheets %%done_del%%",
"time": "2022-09-17",
"rowNumber": 92
},
{
"title": "♻ [[Household]]: *Cardboard* recycling collection %%done_del%%",
"time": "2022-09-20",
"rowNumber": 78
},
{
"title": "🛎 🛍 REMINDER [[Household]]: Monthly shop in France %%done_del%%",
"time": "2022-09-24",
"rowNumber": 85
"rowNumber": 86
},
{
"title": "🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%%",
"time": "2022-09-26",
"rowNumber": 87
"rowNumber": 88
},
{
"title": "♻ [[Household]]: *Paper* recycling collection %%done_del%%",
@ -369,22 +359,32 @@
{
"title": "🛌 [[Household]]: Buy new bed clothes",
"time": "2022-09-30",
"rowNumber": 57
"rowNumber": 61
},
{
"title": ":bed: [[Household]] Change bedsheets %%done_del%%",
"time": "2022-10-01",
"rowNumber": 93
},
{
"title": "♻ [[Household]]: *Cardboard* recycling collection %%done_del%%",
"time": "2022-10-04",
"rowNumber": 78
},
{
"title": ":bed: [[Household]]: Buy bed-side tables",
"time": "2022-10-31",
"rowNumber": 56
"rowNumber": 60
},
{
"title": ":coffee: [[Household]]: Buy a Cappuccino machine",
"time": "2022-11-30",
"rowNumber": 54
"rowNumber": 58
},
{
"title": ":couch_and_lamp: [[Household]]: Replace the sofa",
"time": "2022-12-31",
"rowNumber": 55
"rowNumber": 59
}
],
"01.03 Family/Pia Bousquié.md": [
@ -580,25 +580,13 @@
"00.01 Admin/Calendars/2022-09-12.md": [
{
"title": "10:50 :couch_and_lamp: [[2022-09-12|Memo]], [[@Lifestyle]]: sofa options at the border",
"time": "2022-09-17",
"time": "2022-09-25",
"rowNumber": 80
},
{
"title": "10:50 :chair: [[2022-09-12|Memo]], [[@Lifestyle]]: armchair options at the border",
"time": "2022-09-17",
"rowNumber": 81
}
],
"00.01 Admin/Calendars/2022-09-14.md": [
{
"title": "12:03 :small_airplane: [[2022-09-14|Memo]], [[Geneva]]: reserver un hotel/airbnb pour Geneve",
"time": "2022-09-18",
"time": "2022-09-25",
"rowNumber": 81
},
{
"title": "12:04 :small_airplane: [[2022-09-14|Memo]], [[@@Paris|Paris]]: reserver billets de train + accommodation pour weekend a Paris",
"time": "2022-09-18",
"rowNumber": 82
}
]
},

@ -0,0 +1,24 @@
{
"plugins": {
"plugins-galore": {
"repo": {
"domain": "github.com",
"owner": "dylanpizzo",
"name": "obsidian-plugins-galore",
"url": "https://github.com/dylanpizzo/obsidian-plugins-galore",
"type": "github"
},
"version": "0.1.1"
},
"obsidian-3d-graph": {
"repo": {
"domain": "github.com",
"owner": "AlexW00",
"name": "obsidian-3d-graph",
"url": "https://github.com/AlexW00/obsidian-3d-graph",
"type": "github"
},
"version": "1.0.0"
}
}
}

@ -0,0 +1,388 @@
/*
* THIS IS A GENERATED/BUNDLED FILE.
* The source is available at https://github.com/dylanpizzo/obsidian-plugins-galore.
* Contributions are very welcome!
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
__markAsModule(target);
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = (module2) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/main.ts
__export(exports, {
default: () => Galore
});
var import_obsidian7 = __toModule(require("obsidian"));
// src/util/cacheRequest.ts
var import_obsidian = __toModule(require("obsidian"));
var cache = [];
var cacheRequest = (req) => __async(void 0, null, function* () {
const filteredCache = cache.filter((item) => item.req === JSON.stringify(req));
if (filteredCache.length) {
return filteredCache[0].res;
}
const res = yield (0, import_obsidian.request)(req);
cache.push({ req: JSON.stringify(req), res });
return res;
});
// src/util/gitServerInterface.ts
var countRegexInString = (str, re) => ((str || "").match(re) || []).length;
var getKeyWithMax = (obj) => Object.keys(obj).reduce((a, b) => obj[a] >= obj[b] ? a : b, null);
var parseRepoURL = (url) => __async(void 0, null, function* () {
let urlObj = null;
try {
urlObj = new URL(url);
} catch (e) {
urlObj = new URL("https://" + url);
}
const domain = urlObj.hostname;
let path = urlObj.pathname;
if (path[0] === "/") {
path = path.slice(1);
}
const pathParts = path.split("/");
const owner = pathParts[0];
const name = pathParts[1];
const originBody = yield cacheRequest({ url: urlObj.origin });
const typeScores = {
github: countRegexInString(originBody, /github/gi),
gitea: countRegexInString(originBody, /gitea/gi),
gitlab: countRegexInString(originBody, /gitlab/gi)
};
const type = getKeyWithMax(typeScores);
return {
domain,
owner,
name,
url,
type
};
});
var getRelease = (repo, options) => __async(void 0, null, function* () {
const { type, domain, owner, name } = repo;
const { allowPrerelease = false } = options || {};
let release = null;
if (type === "github") {
const rawReleases = JSON.parse(yield cacheRequest({
url: `https://api.${domain}/repos/${owner}/${name}/releases`
}));
const rawRelease = rawReleases.filter((x) => !x.draft && (allowPrerelease || !x.prerelease)).sort((x) => x.published_at)[0];
release = {
version: rawRelease.tag_name,
assets: rawRelease.assets.map((asset) => ({
name: asset.name,
url: asset.browser_download_url
}))
};
} else if (type === "gitea") {
const rawReleases = JSON.parse(yield cacheRequest({
url: `https://${domain}/api/v1/repos/${owner}/${name}/releases`
}));
const rawRelease = rawReleases.filter((x) => !x.draft && (allowPrerelease || !x.prerelease)).sort((x) => x.published_at)[0];
release = {
version: rawRelease.tag_name,
assets: rawRelease.assets.map((asset) => ({
name: asset.name,
url: asset.browser_download_url
}))
};
} else if (type === "gitlab") {
const rawReleases = JSON.parse(yield cacheRequest({
url: `https://${domain}/api/v4/projects/${owner}%2F${name}/releases`
}));
const rawRelease = rawReleases.filter((x) => allowPrerelease || !x.upcoming_release).sort((x) => x.published_at)[0];
release = {
version: rawRelease.tag_name,
assets: rawRelease.assets.links.map((asset) => ({
name: asset.name,
url: asset.direct_asset_url
}))
};
}
return release;
});
var getAsset = (release, name) => __async(void 0, null, function* () {
const asset = release.assets.filter((asset2) => asset2.name === name)[0];
if (!asset) {
return null;
}
return cacheRequest({
url: asset.url
});
});
var getAssets = (release, names) => __async(void 0, null, function* () {
const assets = names ? release.assets.filter((asset) => names.includes(asset.name)) : release.assets;
return Promise.all(assets.map((asset) => __async(void 0, null, function* () {
return { name: asset.name, content: yield cacheRequest({ url: asset.url }) };
})));
});
// src/ui/settingsPage.ts
var import_obsidian6 = __toModule(require("obsidian"));
// src/util/pluginActions.ts
var import_obsidian3 = __toModule(require("obsidian"));
// src/ui/errorModal.ts
var import_obsidian2 = __toModule(require("obsidian"));
var GaloreErrorModal = class extends import_obsidian2.Modal {
constructor(app2, error) {
super(app2);
this.error = null;
this.error = error;
}
onOpen() {
const { contentEl } = this;
contentEl.setText("Oops. Something went wrong!");
}
onClose() {
const { contentEl } = this;
contentEl.empty();
}
};
// src/util/pluginActions.ts
var getPluginsDir = (app2) => {
return (0, import_obsidian3.normalizePath)(app2.vault.configDir + "/plugins") + "/";
};
var getPluginPath = (app2, pluginID) => {
return getPluginsDir(app2) + pluginID + "/";
};
var getRemotePluginMeta = (repo) => __async(void 0, null, function* () {
try {
const release = yield getRelease(repo);
return { repo, version: release.version };
} catch (error) {
console.error(error);
new GaloreErrorModal(app, error).open();
}
});
var getRemotePlugin = (repo) => __async(void 0, null, function* () {
try {
const release = yield getRelease(repo);
const galore = { repo, version: release.version };
const rawManifest = yield getAsset(release, "manifest.json");
const manifest = JSON.parse(yield getAsset(release, "manifest.json"));
const assets = yield getAssets(release);
return {
galore,
manifest,
assets
};
} catch (error) {
console.error(error);
new GaloreErrorModal(app, error).open();
}
});
var getLocalPluginMeta = (pluginsGalore, pluginID) => {
return pluginsGalore.galoreData.plugins[pluginID];
};
var writePlugin = (pluginsGalore, plugin) => __async(void 0, null, function* () {
try {
const path = getPluginPath(app, plugin.manifest.id);
const adapter = app.vault.adapter;
if (!(yield adapter.exists(path))) {
yield adapter.mkdir(path);
}
pluginsGalore.galoreData.plugins[plugin.manifest.id] = plugin.galore;
yield pluginsGalore.saveGaloreData();
yield Promise.all(plugin.assets.map((asset) => __async(void 0, null, function* () {
return adapter.write(path + asset.name, asset.content);
})));
} catch (error) {
console.error(error);
new GaloreErrorModal(app, error).open();
}
});
var installPluginFromRepo = (pluginsGalore, repo) => __async(void 0, null, function* () {
const plugin = yield getRemotePlugin(repo);
yield writePlugin(pluginsGalore, plugin);
return plugin;
});
var getGalorePlugins = (pluginsGalore) => __async(void 0, null, function* () {
try {
const app2 = pluginsGalore.app;
const adapter = app2.vault.adapter;
const pluginsDir = getPluginsDir(app2);
const galorePluginPaths = Object.keys(pluginsGalore.galoreData.plugins).map((pluginID) => pluginsDir + "/" + pluginID + "/");
const galorePlugins = yield Promise.all(galorePluginPaths.map((path) => __async(void 0, null, function* () {
const localManifest = JSON.parse(yield adapter.read(path + "manifest.json"));
const localGalore = getLocalPluginMeta(pluginsGalore, localManifest.id);
const remoteGalore = yield getRemotePluginMeta(localGalore.repo);
return {
manifest: localManifest,
repo: localGalore.repo,
localVersion: localGalore.version,
remoteVersion: remoteGalore.version,
canUpdate: localGalore.version !== remoteGalore.version
};
})));
return galorePlugins;
} catch (error) {
console.error(error);
new GaloreErrorModal(app, error).open();
}
});
// src/ui/updateModal.ts
var import_obsidian4 = __toModule(require("obsidian"));
var GaloreUpdateModal = class extends import_obsidian4.Modal {
constructor(plugin, galorePlugins) {
super(app);
this.galorePlugins = null;
this.plugin = plugin;
this.app = plugin.app;
this.galorePlugins = galorePlugins;
}
onOpen() {
const { contentEl } = this;
contentEl.createEl("h2", { text: "Plugins Galore: Update Plugins" });
new import_obsidian4.Setting(contentEl).setName("Select the plugins below to update, and then click Update.").setDesc("").addButton((button) => button.setButtonText("Cancel").onClick((ev) => {
this.close();
})).addButton((button) => button.setButtonText("Update").setCta().onClick((ev) => __async(this, null, function* () {
const pluginsToUpdate = this.galorePlugins.filter((plugin) => plugin.toggle.getValue());
for (const plugin of pluginsToUpdate) {
yield installPluginFromRepo(this.plugin, plugin.repo);
}
new import_obsidian4.Notice(`Updated ${pluginsToUpdate.length} plugins`);
this.close();
})));
for (const plugin of this.galorePlugins) {
new import_obsidian4.Setting(contentEl).setName(plugin.manifest.name).setDesc(`Version: ${plugin.localVersion} -> ${plugin.remoteVersion}`).addToggle((toggle) => {
plugin.toggle = toggle;
toggle.setValue(true);
});
}
}
onClose() {
const { contentEl } = this;
contentEl.empty();
}
};
// src/ui/addModal.ts
var import_obsidian5 = __toModule(require("obsidian"));
var GaloreAddModal = class extends import_obsidian5.Modal {
constructor(plugin) {
super(app);
this.plugin = plugin;
this.app = plugin.app;
}
onOpen() {
const { contentEl } = this;
contentEl.empty();
contentEl.createEl("h2", { text: "Plugins Galore: Add a Plugin" });
let repoURL = "";
let siteType = "github";
new import_obsidian5.Setting(contentEl).setName("Repo URL").setDesc("").addText((text) => text.setPlaceholder("https://github.com/{owner}/{plugin-repo}").setValue(repoURL).onChange((value) => {
repoURL = value;
}));
new import_obsidian5.Setting(contentEl).setName("Install the plugin").setDesc("").addButton((button) => button.setButtonText("Install").setCta().onClick((ev) => __async(this, null, function* () {
const repo = yield parseRepoURL(repoURL);
const plugin = yield installPluginFromRepo(this.plugin, repo);
new import_obsidian5.Notice(`Installed ${plugin.manifest.name}.`);
this.close();
})));
}
onClose() {
const { contentEl } = this;
contentEl.empty();
}
};
// src/ui/settingsPage.ts
var GaloreSettingTab = class extends import_obsidian6.PluginSettingTab {
constructor(plugin) {
super(app, plugin);
this.plugin = plugin;
this.app = plugin.app;
}
display() {
const { containerEl } = this;
containerEl.empty();
containerEl.createEl("h2", { text: "Plugins Galore" });
let repoURL = "";
let repoInput = null;
new import_obsidian6.Setting(containerEl).setName("Add a plugin").setDesc("").addButton((button) => button.setButtonText("Add a plugin").setCta().onClick((ev) => __async(this, null, function* () {
new GaloreAddModal(this.plugin).open();
})));
new import_obsidian6.Setting(containerEl).setName("Installed Plugins").setDesc("This only checks for updates on plugins installed through Plugins Galore.").addButton((button) => button.setButtonText("Check for updates").setCta().onClick((ev) => __async(this, null, function* () {
const galorePlugins = yield getGalorePlugins(this.plugin);
const galorePluginsThatCanUpdate = galorePlugins.filter((x) => x.canUpdate);
if (galorePluginsThatCanUpdate.length) {
new GaloreUpdateModal(this.plugin, galorePluginsThatCanUpdate).open();
} else {
new import_obsidian6.Notice("No plugins updates found.");
}
})));
}
};
// src/main.ts
var Galore = class extends import_obsidian7.Plugin {
onload() {
return __async(this, null, function* () {
yield this.loadGaloreData();
this.addSettingTab(new GaloreSettingTab(this));
});
}
loadGaloreData() {
return __async(this, null, function* () {
this.galoreData = Object.assign({}, {
plugins: {
"plugins-galore": {
repo: yield parseRepoURL("https://github.com/dylanpizzo/obsidian-plugins-galore"),
version: this.manifest.version
}
}
}, yield this.loadData());
});
}
saveGaloreData() {
return __async(this, null, function* () {
yield this.saveData(this.galoreData);
});
}
};

@ -0,0 +1,10 @@
{
"id": "plugins-galore",
"name": "Plugins Galore",
"version": "0.1.1",
"minAppVersion": "0.14.0",
"description": "This is an Obsidian plugin to allow easily sideloading other plugins.",
"author": "Dylan Pizzo",
"authorUrl": "https://github.com/dylanpizzo",
"isDesktopOnly": false
}

@ -155,9 +155,9 @@
"How Queen Elizabeth II Preserved the Monarchy": {
"title": "How Queen Elizabeth II Preserved the Monarchy",
"podcastName": "The Daily",
"time": 2138.305979181796,
"duration": 2138.3314285714287,
"finished": false
"time": 0,
"duration": 0,
"finished": true
},
"Serena Williamss Final Run": {
"title": "Serena Williamss Final Run",
@ -179,6 +179,20 @@
"time": 2138.305979181796,
"duration": 2138.3314285714287,
"finished": false
},
"Can the U.K. Remain United Without the Queen?": {
"title": "Can the U.K. Remain United Without the Queen?",
"podcastName": "The Daily",
"time": 0,
"duration": 2195.16,
"finished": false
},
"Saladin Takes Back the Holy City": {
"title": "Saladin Takes Back the Holy City",
"podcastName": "HISTORY This Week",
"time": 1826.168163265306,
"duration": 1826.168163265306,
"finished": true
}
},
"favorites": {
@ -194,6 +208,16 @@
"shouldEpisodeRemoveAfterPlay": true,
"shouldRepeat": false,
"episodes": [
{
"title": "How Queen Elizabeth II Preserved the Monarchy",
"streamUrl": "https://dts.podtrac.com/redirect.mp3/chrt.fm/track/8DB4DB/pdst.fm/e/nyt.simplecastaudio.com/03d8b493-87fc-4bd1-931f-8a8e9b945d8a/episodes/e39b8c80-d74f-48f0-880d-78b71cb3c7ff/audio/128/default.mp3?aid=rss_feed&awCollectionId=03d8b493-87fc-4bd1-931f-8a8e9b945d8a&awEpisodeId=e39b8c80-d74f-48f0-880d-78b71cb3c7ff&feed=54nAGcIl",
"url": "https://www.nytimes.com/the-daily",
"description": "<p>The death of Queen Elizabeth II on Thursday brought to an end a remarkable reign that spanned seven decades, 15 prime ministers and 14 American presidents.</p><p>During her time on the throne, which saw the crumbling of the British Empire and the buffeting of the royal family by scandals, Elizabeths courtly and reserved manner helped to shore up the monarchy and provided an unwavering constant for her country, the Commonwealth and the wider world.</p><p>Guest: Alan Cowell, a contributor to The New York Times and a former Times foreign correspondent.</p><p>Background reading: </p><ul><li>Amid social and economic upheaval across her 70-year reign, the queen remained unshakably<a href=\"https://www.nytimes.com/2022/09/08/world/europe/queen-elizabeth-dead.html\"> committed to the rituals of her role</a>.</li><li>Her heir, Charles, was long an uneasy prince. But he comes to the throne, at 73, as<a href=\"https://www.nytimes.com/2022/09/08/world/europe/charles-king-uk.html\"> a self-assured, gray-haired eminence</a>.</li></ul><p>For more information on todays episode, visit <a href=\"http://nytimes.com/thedaily?smid=pc-thedaily\">nytimes.com/thedaily</a>. Transcripts of each episode will be made available by the next workday. </p>\n",
"podcastName": "The Daily",
"artworkUrl": "https://is1-ssl.mzstatic.com/image/thumb/Podcasts115/v4/1c/ac/04/1cac0421-4483-ff09-4f80-19710d9feda4/mza_12421371692158516891.jpeg/100x100bb.jpg",
"episodeDate": "2022-09-09T09:50:00.000Z",
"feedUrl": "https://feeds.simplecast.com/54nAGcIl"
},
{
"title": "A User's Guide to the Midterm Elections",
"streamUrl": "https://dts.podtrac.com/redirect.mp3/chrt.fm/track/8DB4DB/pdst.fm/e/nyt.simplecastaudio.com/03d8b493-87fc-4bd1-931f-8a8e9b945d8a/episodes/59692fff-0662-460a-a1a9-7fbc81c0c960/audio/128/default.mp3?aid=rss_feed&awCollectionId=03d8b493-87fc-4bd1-931f-8a8e9b945d8a&awEpisodeId=59692fff-0662-460a-a1a9-7fbc81c0c960&feed=54nAGcIl",
@ -278,13 +302,13 @@
"skipBackwardLength": 15,
"skipForwardLength": 15,
"currentEpisode": {
"title": "How Queen Elizabeth II Preserved the Monarchy",
"streamUrl": "https://dts.podtrac.com/redirect.mp3/chrt.fm/track/8DB4DB/pdst.fm/e/nyt.simplecastaudio.com/03d8b493-87fc-4bd1-931f-8a8e9b945d8a/episodes/e39b8c80-d74f-48f0-880d-78b71cb3c7ff/audio/128/default.mp3?aid=rss_feed&awCollectionId=03d8b493-87fc-4bd1-931f-8a8e9b945d8a&awEpisodeId=e39b8c80-d74f-48f0-880d-78b71cb3c7ff&feed=54nAGcIl",
"title": "Can the U.K. Remain United Without the Queen?",
"streamUrl": "https://dts.podtrac.com/redirect.mp3/chrt.fm/track/8DB4DB/pdst.fm/e/nyt.simplecastaudio.com/03d8b493-87fc-4bd1-931f-8a8e9b945d8a/episodes/cbe25511-3623-4092-b274-c9bf5cd0c36b/audio/128/default.mp3?aid=rss_feed&awCollectionId=03d8b493-87fc-4bd1-931f-8a8e9b945d8a&awEpisodeId=cbe25511-3623-4092-b274-c9bf5cd0c36b&feed=54nAGcIl",
"url": "https://www.nytimes.com/the-daily",
"description": "<p>The death of Queen Elizabeth II on Thursday brought to an end a remarkable reign that spanned seven decades, 15 prime ministers and 14 American presidents.</p><p>During her time on the throne, which saw the crumbling of the British Empire and the buffeting of the royal family by scandals, Elizabeths courtly and reserved manner helped to shore up the monarchy and provided an unwavering constant for her country, the Commonwealth and the wider world.</p><p>Guest: Alan Cowell, a contributor to The New York Times and a former Times foreign correspondent.</p><p>Background reading: </p><ul><li>Amid social and economic upheaval across her 70-year reign, the queen remained unshakably<a href=\"https://www.nytimes.com/2022/09/08/world/europe/queen-elizabeth-dead.html\"> committed to the rituals of her role</a>.</li><li>Her heir, Charles, was long an uneasy prince. But he comes to the throne, at 73, as<a href=\"https://www.nytimes.com/2022/09/08/world/europe/charles-king-uk.html\"> a self-assured, gray-haired eminence</a>.</li></ul><p>For more information on todays episode, visit <a href=\"http://nytimes.com/thedaily?smid=pc-thedaily\">nytimes.com/thedaily</a>. Transcripts of each episode will be made available by the next workday. </p>\n",
"description": "<p>The funeral of Queen Elizabeth today will be one of the most extraordinary public spectacles of the last several decades in Britain, accompanied by an outpouring of sadness, reverence and respect.</p><p>But the end of the queens 70-year reign has also prompted long-delayed conversations about the future of the Commonwealth and of the four nations that make up the United Kingdom.</p><p>Guest: <a href=\"https://www.nytimes.com/by/mark-landler?smid=pc-thedaily\">Mark Landler</a>, the London bureau chief for The New York Times.</p><p>Background reading: </p><ul><li>In Commonwealth nations with British colonial histories, Queen Elizabeths death has<a href=\"https://www.nytimes.com/2022/09/11/world/queen-elizabeth-commonwealth.html\"> rekindled discussions about a more independent future</a>.</li><li>The loss of the beloved figurehead has left many in Britain anxious and unmoored, unsure of their nations identity, its economic and social well-being, or<a href=\"https://www.nytimes.com/2022/09/10/world/europe/queen-elizabeth-uk-identity.html\"> even its role in the world</a>.</li></ul><p>For more information on todays episode, visit <a href=\"http://nytimes.com/thedaily?smid=pc-thedaily\">nytimes.com/thedaily</a>. Transcripts of each episode will be made available by the next workday. </p>\n",
"podcastName": "The Daily",
"artworkUrl": "https://is1-ssl.mzstatic.com/image/thumb/Podcasts115/v4/1c/ac/04/1cac0421-4483-ff09-4f80-19710d9feda4/mza_12421371692158516891.jpeg/100x100bb.jpg",
"episodeDate": "2022-09-09T09:50:00.000Z",
"episodeDate": "2022-09-19T09:50:00.000Z",
"feedUrl": "https://feeds.simplecast.com/54nAGcIl"
},
"timestamp": {

@ -1765,8 +1765,7 @@ var Suggest = class {
}
};
var TextInputSuggest = class {
constructor(app, inputEl) {
this.app = app;
constructor(inputEl) {
this.inputEl = inputEl;
this.scope = new import_obsidian2.Scope();
this.suggestEl = createDiv("suggestion-container");
@ -1789,13 +1788,13 @@ var TextInputSuggest = class {
}
if (suggestions.length > 0) {
this.suggest.setSuggestions(suggestions);
this.open(this.app.dom.appContainerEl, this.inputEl);
this.open(app.dom.appContainerEl, this.inputEl);
} else {
this.close();
}
}
open(container, inputEl) {
this.app.keymap.pushScope(this.scope);
app.keymap.pushScope(this.scope);
container.appendChild(this.suggestEl);
this.popper = createPopper(inputEl, this.suggestEl, {
placement: "bottom-start",
@ -1818,7 +1817,7 @@ var TextInputSuggest = class {
});
}
close() {
this.app.keymap.popScope(this.scope);
app.keymap.popScope(this.scope);
this.suggest.setSuggestions([]);
if (this.popper)
this.popper.destroy();
@ -1829,7 +1828,7 @@ var TextInputSuggest = class {
// src/settings/suggesters/FolderSuggester.ts
var FolderSuggest = class extends TextInputSuggest {
getSuggestions(inputStr) {
const abstractFiles = this.app.vault.getAllLoadedFiles();
const abstractFiles = app.vault.getAllLoadedFiles();
const folders = [];
const lowerCaseInputStr = inputStr.toLowerCase();
abstractFiles.forEach((folder) => {
@ -1863,7 +1862,7 @@ function escape_RegExp(str) {
function generate_dynamic_command_regex() {
return /(<%(?:-|_)?\s*[*~]{0,1})\+((?:.|\s)*?%>)/g;
}
function resolve_tfolder(app, folder_str) {
function resolve_tfolder(folder_str) {
folder_str = (0, import_obsidian4.normalizePath)(folder_str);
const folder = app.vault.getAbstractFileByPath(folder_str);
if (!folder) {
@ -1874,7 +1873,7 @@ function resolve_tfolder(app, folder_str) {
}
return folder;
}
function resolve_tfile(app, file_str) {
function resolve_tfile(file_str) {
file_str = (0, import_obsidian4.normalizePath)(file_str);
const file = app.vault.getAbstractFileByPath(file_str);
if (!file) {
@ -1885,8 +1884,8 @@ function resolve_tfile(app, file_str) {
}
return file;
}
function get_tfiles_from_folder(app, folder_str) {
const folder = resolve_tfolder(app, folder_str);
function get_tfiles_from_folder(folder_str) {
const folder = resolve_tfolder(folder_str);
const files = [];
import_obsidian4.Vault.recurseChildren(folder, (file) => {
if (file instanceof import_obsidian4.TFile) {
@ -1914,9 +1913,8 @@ var FileSuggestMode;
FileSuggestMode2[FileSuggestMode2["ScriptFiles"] = 1] = "ScriptFiles";
})(FileSuggestMode || (FileSuggestMode = {}));
var FileSuggest = class extends TextInputSuggest {
constructor(app, inputEl, plugin, mode) {
super(app, inputEl);
this.app = app;
constructor(inputEl, plugin, mode) {
super(inputEl);
this.inputEl = inputEl;
this.plugin = plugin;
this.mode = mode;
@ -1938,7 +1936,7 @@ var FileSuggest = class extends TextInputSuggest {
}
}
getSuggestions(input_str) {
const all_files = errorWrapperSync(() => get_tfiles_from_folder(this.app, this.get_folder(this.mode)), this.get_error_msg(this.mode));
const all_files = errorWrapperSync(() => get_tfiles_from_folder(this.get_folder(this.mode)), this.get_error_msg(this.mode));
if (!all_files) {
return [];
}
@ -1979,9 +1977,8 @@ var DEFAULT_SETTINGS = {
enable_ribbon_icon: true
};
var TemplaterSettingTab = class extends import_obsidian6.PluginSettingTab {
constructor(app, plugin) {
constructor(plugin) {
super(app, plugin);
this.app = app;
this.plugin = plugin;
}
display() {
@ -2006,7 +2003,7 @@ var TemplaterSettingTab = class extends import_obsidian6.PluginSettingTab {
}
add_template_folder_setting() {
new import_obsidian6.Setting(this.containerEl).setName("Template folder location").setDesc("Files in this folder will be available as templates.").addSearch((cb) => {
new FolderSuggest(this.app, cb.inputEl);
new FolderSuggest(cb.inputEl);
cb.setPlaceholder("Example: folder1/folder2").setValue(this.plugin.settings.templates_folder).onChange((new_folder) => {
this.plugin.settings.templates_folder = new_folder;
this.plugin.save_settings();
@ -2067,7 +2064,7 @@ var TemplaterSettingTab = class extends import_obsidian6.PluginSettingTab {
this.plugin.save_settings();
if (this.plugin.settings.enable_ribbon_icon) {
this.plugin.addRibbonIcon("templater-icon", "Templater", () => __async(this, null, function* () {
this.fuzzy_suggester.insert_template();
this.plugin.fuzzy_suggester.insert_template();
})).setAttribute("id", "rb-templater-icon");
} else {
(_a = document.getElementById("rb-templater-icon")) == null ? void 0 : _a.remove();
@ -2082,7 +2079,7 @@ var TemplaterSettingTab = class extends import_obsidian6.PluginSettingTab {
new import_obsidian6.Setting(this.containerEl).setDesc(desc);
this.plugin.settings.enabled_templates_hotkeys.forEach((template, index) => {
const s = new import_obsidian6.Setting(this.containerEl).addSearch((cb) => {
new FileSuggest(this.app, cb.inputEl, this.plugin, FileSuggestMode.TemplateFiles);
new FileSuggest(cb.inputEl, this.plugin, FileSuggestMode.TemplateFiles);
cb.setPlaceholder("Example: folder1/template_file").setValue(template).onChange((new_template) => {
if (new_template && this.plugin.settings.enabled_templates_hotkeys.contains(new_template)) {
log_error(new TemplaterError("This template is already bound to a hotkey"));
@ -2095,8 +2092,8 @@ var TemplaterSettingTab = class extends import_obsidian6.PluginSettingTab {
cb.containerEl.addClass("templater_search");
}).addExtraButton((cb) => {
cb.setIcon("any-key").setTooltip("Configure Hotkey").onClick(() => {
this.app.setting.openTabById("hotkeys");
const tab = this.app.setting.activeTab;
app.setting.openTabById("hotkeys");
const tab = app.setting.activeTab;
tab.searchInputEl.value = "Templater: Insert";
tab.updateHotkeyVisibility();
});
@ -2159,7 +2156,7 @@ var TemplaterSettingTab = class extends import_obsidian6.PluginSettingTab {
});
this.plugin.settings.folder_templates.forEach((folder_template, index) => {
const s = new import_obsidian6.Setting(this.containerEl).addSearch((cb) => {
new FolderSuggest(this.app, cb.inputEl);
new FolderSuggest(cb.inputEl);
cb.setPlaceholder("Folder").setValue(folder_template.folder).onChange((new_folder) => {
if (new_folder && this.plugin.settings.folder_templates.some((e) => e.folder == new_folder)) {
log_error(new TemplaterError("This folder already has a template associated with it"));
@ -2170,7 +2167,7 @@ var TemplaterSettingTab = class extends import_obsidian6.PluginSettingTab {
});
cb.containerEl.addClass("templater_search");
}).addSearch((cb) => {
new FileSuggest(this.app, cb.inputEl, this.plugin, FileSuggestMode.TemplateFiles);
new FileSuggest(cb.inputEl, this.plugin, FileSuggestMode.TemplateFiles);
cb.setPlaceholder("Template").setValue(folder_template.template).onChange((new_template) => {
this.plugin.settings.folder_templates[index].template = new_template;
this.plugin.save_settings();
@ -2205,7 +2202,7 @@ var TemplaterSettingTab = class extends import_obsidian6.PluginSettingTab {
new import_obsidian6.Setting(this.containerEl).setDesc(desc);
this.plugin.settings.startup_templates.forEach((template, index) => {
const s = new import_obsidian6.Setting(this.containerEl).addSearch((cb) => {
new FileSuggest(this.app, cb.inputEl, this.plugin, FileSuggestMode.TemplateFiles);
new FileSuggest(cb.inputEl, this.plugin, FileSuggestMode.TemplateFiles);
cb.setPlaceholder("Example: folder1/template_file").setValue(template).onChange((new_template) => {
if (new_template && this.plugin.settings.startup_templates.contains(new_template)) {
log_error(new TemplaterError("This startup template already exist"));
@ -2240,7 +2237,7 @@ var TemplaterSettingTab = class extends import_obsidian6.PluginSettingTab {
text: "documentation"
}), " for more information.");
new import_obsidian6.Setting(this.containerEl).setName("Script files folder location").setDesc(desc).addSearch((cb) => {
new FolderSuggest(this.app, cb.inputEl);
new FolderSuggest(cb.inputEl);
cb.setPlaceholder("Example: folder1/folder2").setValue(this.plugin.settings.user_scripts_folder).onChange((new_folder) => {
this.plugin.settings.user_scripts_folder = new_folder;
this.plugin.save_settings();
@ -2252,7 +2249,7 @@ var TemplaterSettingTab = class extends import_obsidian6.PluginSettingTab {
if (!this.plugin.settings.user_scripts_folder) {
name = "No User Scripts folder set";
} else {
const files = errorWrapperSync(() => get_tfiles_from_folder(this.app, this.plugin.settings.user_scripts_folder), `User Scripts folder doesn't exist`);
const files = errorWrapperSync(() => get_tfiles_from_folder(this.plugin.settings.user_scripts_folder), `User Scripts folder doesn't exist`);
if (!files || files.length === 0) {
name = "No User Scripts detected";
} else {
@ -2376,17 +2373,16 @@ var OpenMode;
OpenMode2[OpenMode2["CreateNoteTemplate"] = 1] = "CreateNoteTemplate";
})(OpenMode || (OpenMode = {}));
var FuzzySuggester = class extends import_obsidian7.FuzzySuggestModal {
constructor(app, plugin) {
constructor(plugin) {
super(app);
this.app = app;
this.plugin = plugin;
this.setPlaceholder("Type name of a template...");
}
getItems() {
if (!this.plugin.settings.templates_folder) {
return this.app.vault.getMarkdownFiles();
return app.vault.getMarkdownFiles();
}
const files = errorWrapperSync(() => get_tfiles_from_folder(this.app, this.plugin.settings.templates_folder), `Couldn't retrieve template files from templates folder ${this.plugin.settings.templates_folder}`);
const files = errorWrapperSync(() => get_tfiles_from_folder(this.plugin.settings.templates_folder), `Couldn't retrieve template files from templates folder ${this.plugin.settings.templates_folder}`);
if (!files) {
return [];
}
@ -2432,8 +2428,7 @@ var import_obsidian13 = __toModule(require("obsidian"));
// src/core/functions/internal_functions/InternalModule.ts
var InternalModule = class {
constructor(app, plugin) {
this.app = app;
constructor(plugin) {
this.plugin = plugin;
this.static_functions = new Map();
this.dynamic_functions = new Map();
@ -2545,7 +2540,7 @@ var InternalModuleFile = class extends InternalModule {
}
generate_content() {
return __async(this, null, function* () {
return yield this.app.vault.read(this.config.target_file);
return yield app.vault.read(this.config.target_file);
});
}
generate_create_new() {
@ -2572,7 +2567,7 @@ var InternalModuleFile = class extends InternalModule {
}
generate_cursor_append() {
return (content) => {
const active_view = this.app.workspace.getActiveViewOfType(import_obsidian8.MarkdownView);
const active_view = app.workspace.getActiveViewOfType(import_obsidian8.MarkdownView);
if (active_view === null) {
log_error(new TemplaterError("No active view, can't append to cursor."));
return;
@ -2584,19 +2579,14 @@ var InternalModuleFile = class extends InternalModule {
};
}
generate_exists() {
return (filename) => {
let match;
if ((match = this.linkpath_regex.exec(filename)) !== null) {
filename = match[1];
}
const file = this.app.metadataCache.getFirstLinkpathDest(filename, "");
return file != null;
};
return (filename) => __async(this, null, function* () {
return yield app.vault.exists(filename);
});
}
generate_find_tfile() {
return (filename) => {
const path = (0, import_obsidian8.normalizePath)(filename);
return this.app.metadataCache.getFirstLinkpathDest(path, "");
return app.metadataCache.getFirstLinkpathDest(path, "");
};
}
generate_folder() {
@ -2621,7 +2611,7 @@ var InternalModuleFile = class extends InternalModule {
}
let inc_file_content;
if (include_link instanceof import_obsidian8.TFile) {
inc_file_content = yield this.app.vault.read(include_link);
inc_file_content = yield app.vault.read(include_link);
} else {
let match;
if ((match = this.linkpath_regex.exec(include_link)) === null) {
@ -2629,14 +2619,14 @@ var InternalModuleFile = class extends InternalModule {
throw new TemplaterError("Invalid file format, provide an obsidian link between quotes.");
}
const { path, subpath } = (0, import_obsidian8.parseLinktext)(match[1]);
const inc_file = this.app.metadataCache.getFirstLinkpathDest(path, "");
const inc_file = app.metadataCache.getFirstLinkpathDest(path, "");
if (!inc_file) {
this.include_depth -= 1;
throw new TemplaterError(`File ${include_link} doesn't exist`);
}
inc_file_content = yield this.app.vault.read(inc_file);
inc_file_content = yield app.vault.read(inc_file);
if (subpath) {
const cache = this.app.metadataCache.getFileCache(inc_file);
const cache = app.metadataCache.getFileCache(inc_file);
if (cache) {
const result = (0, import_obsidian8.resolveSubpath)(cache, subpath);
if (result) {
@ -2672,19 +2662,24 @@ var InternalModuleFile = class extends InternalModule {
yield window.app.vault.createFolder(dir);
}
}
yield this.app.fileManager.renameFile(file, new_path);
yield app.fileManager.renameFile(file, new_path);
return "";
});
}
generate_path() {
return (relative = false) => {
let vault_path = "";
if (import_obsidian8.Platform.isMobileApp) {
return UNSUPPORTED_MOBILE_TEMPLATE;
}
if (!(this.app.vault.adapter instanceof import_obsidian8.FileSystemAdapter)) {
const vault_adapter = app.vault.adapter.fs.uri;
const vault_base = app.vault.adapter.basePath;
vault_path = `${vault_adapter}/${vault_base}`;
} else {
if (app.vault.adapter instanceof import_obsidian8.FileSystemAdapter) {
vault_path = app.vault.adapter.getBasePath();
} else {
throw new TemplaterError("app.vault is not a FileSystemAdapter instance");
}
const vault_path = this.app.vault.adapter.getBasePath();
}
if (relative) {
return this.config.target_file.path;
} else {
@ -2698,13 +2693,13 @@ var InternalModuleFile = class extends InternalModule {
throw new TemplaterError("File name cannot contain any of these characters: \\ / :");
}
const new_path = (0, import_obsidian8.normalizePath)(`${this.config.target_file.parent.path}/${new_title}.${this.config.target_file.extension}`);
yield this.app.fileManager.renameFile(this.config.target_file, new_path);
yield app.fileManager.renameFile(this.config.target_file, new_path);
return "";
});
}
generate_selection() {
return () => {
const active_view = this.app.workspace.getActiveViewOfType(import_obsidian8.MarkdownView);
const active_view = app.workspace.getActiveViewOfType(import_obsidian8.MarkdownView);
if (active_view == null) {
throw new TemplaterError("Active view is null, can't read selection.");
}
@ -2713,9 +2708,12 @@ var InternalModuleFile = class extends InternalModule {
};
}
generate_tags() {
const cache = this.app.metadataCache.getFileCache(this.config.target_file);
const cache = app.metadataCache.getFileCache(this.config.target_file);
if (cache) {
return (0, import_obsidian8.getAllTags)(cache);
}
return null;
}
generate_title() {
return this.config.target_file.basename;
}
@ -2769,12 +2767,20 @@ var InternalModuleWeb = class extends InternalModule {
generate_random_picture() {
return (size, query, include_size = false) => __async(this, null, function* () {
try {
const response = yield this.getRequest(`https://source.unsplash.com/random/${size != null ? size : ""}?${query != null ? query : ""}`);
const url = response.url;
const response = yield this.getRequest(`https://templater-unsplash.fly.dev/${query ? "?q=" + query : ""}`).then((res) => res.json());
let url = response.full;
if (size && !include_size) {
if (size.includes("x")) {
const [width, height] = size.split("x");
url = url.concat(`&w=${width}&h=${height}`);
} else {
url = url.concat(`&w=${size}`);
}
}
if (include_size) {
return `![tp.web.random_picture|${size}](${url})`;
return `![photo by ${response.photog} on Unsplash|${size}](${url})`;
}
return `![tp.web.random_picture](${url})`;
return `![photo by ${response.photog} on Unsplash](${url})`;
} catch (error) {
new TemplaterError("Error generating random picture");
return "Error generating random picture";
@ -2795,7 +2801,7 @@ var InternalModuleFrontmatter = class extends InternalModule {
}
create_dynamic_templates() {
return __async(this, null, function* () {
const cache = this.app.metadataCache.getFileCache(this.config.target_file);
const cache = app.metadataCache.getFileCache(this.config.target_file);
this.dynamic_functions = new Map(Object.entries((cache == null ? void 0 : cache.frontmatter) || {}));
});
}
@ -2807,7 +2813,7 @@ var import_obsidian11 = __toModule(require("obsidian"));
// src/core/functions/internal_functions/system/PromptModal.ts
var import_obsidian9 = __toModule(require("obsidian"));
var PromptModal = class extends import_obsidian9.Modal {
constructor(app, prompt_text, default_value, multi_line) {
constructor(prompt_text, default_value, multi_line) {
super(app);
this.prompt_text = prompt_text;
this.default_value = default_value;
@ -2884,13 +2890,13 @@ var PromptModal = class extends import_obsidian9.Modal {
// src/core/functions/internal_functions/system/SuggesterModal.ts
var import_obsidian10 = __toModule(require("obsidian"));
var SuggesterModal = class extends import_obsidian10.FuzzySuggestModal {
constructor(app, text_items, items, placeholder, limit) {
constructor(text_items, items, placeholder, limit) {
super(app);
this.text_items = text_items;
this.items = items;
this.submitted = false;
this.setPlaceholder(placeholder);
this.limit = limit;
limit && (this.limit = limit);
}
getItems() {
return this.items;
@ -2950,7 +2956,7 @@ var InternalModuleSystem = class extends InternalModule {
}
generate_prompt() {
return (prompt_text, default_value, throw_on_cancel = false, multi_line = false) => __async(this, null, function* () {
const prompt = new PromptModal(this.app, prompt_text, default_value, multi_line);
const prompt = new PromptModal(prompt_text, default_value, multi_line);
const promise = new Promise((resolve2, reject) => prompt.openAndGetValue(resolve2, reject));
try {
return yield promise;
@ -2964,7 +2970,7 @@ var InternalModuleSystem = class extends InternalModule {
}
generate_suggester() {
return (text_items, items, throw_on_cancel = false, placeholder = "", limit) => __async(this, null, function* () {
const suggester = new SuggesterModal(this.app, text_items, items, placeholder, limit);
const suggester = new SuggesterModal(text_items, items, placeholder, limit);
const promise = new Promise((resolve2, reject) => suggester.openAndGetValue(resolve2, reject));
try {
return yield promise;
@ -3001,16 +3007,15 @@ var InternalModuleConfig = class extends InternalModule {
// src/core/functions/internal_functions/InternalFunctions.ts
var InternalFunctions = class {
constructor(app, plugin) {
this.app = app;
constructor(plugin) {
this.plugin = plugin;
this.modules_array = [];
this.modules_array.push(new InternalModuleDate(this.app, this.plugin));
this.modules_array.push(new InternalModuleFile(this.app, this.plugin));
this.modules_array.push(new InternalModuleWeb(this.app, this.plugin));
this.modules_array.push(new InternalModuleFrontmatter(this.app, this.plugin));
this.modules_array.push(new InternalModuleSystem(this.app, this.plugin));
this.modules_array.push(new InternalModuleConfig(this.app, this.plugin));
this.modules_array.push(new InternalModuleDate(this.plugin));
this.modules_array.push(new InternalModuleFile(this.plugin));
this.modules_array.push(new InternalModuleWeb(this.plugin));
this.modules_array.push(new InternalModuleFrontmatter(this.plugin));
this.modules_array.push(new InternalModuleSystem(this.plugin));
this.modules_array.push(new InternalModuleConfig(this.plugin));
}
init() {
return __async(this, null, function* () {
@ -3035,7 +3040,7 @@ var import_child_process = __toModule(require("child_process"));
var import_util = __toModule(require("util"));
var import_obsidian12 = __toModule(require("obsidian"));
var UserSystemFunctions = class {
constructor(app, plugin) {
constructor(plugin) {
this.plugin = plugin;
if (import_obsidian12.Platform.isMobileApp || !(app.vault.adapter instanceof import_obsidian12.FileSystemAdapter)) {
this.cwd = "";
@ -3091,14 +3096,13 @@ var UserSystemFunctions = class {
// src/core/functions/user_functions/UserScriptFunctions.ts
var UserScriptFunctions = class {
constructor(app, plugin) {
this.app = app;
constructor(plugin) {
this.plugin = plugin;
}
generate_user_script_functions() {
return __async(this, null, function* () {
const user_script_functions = new Map();
const files = errorWrapperSync(() => get_tfiles_from_folder(this.app, this.plugin.settings.user_scripts_folder), `Couldn't find user script folder "${this.plugin.settings.user_scripts_folder}"`);
const files = errorWrapperSync(() => get_tfiles_from_folder(this.plugin.settings.user_scripts_folder), `Couldn't find user script folder "${this.plugin.settings.user_scripts_folder}"`);
if (!files) {
return new Map();
}
@ -3112,14 +3116,14 @@ var UserScriptFunctions = class {
}
load_user_script_function(file, user_script_functions) {
return __async(this, null, function* () {
let req = (s) => {
const req = (s) => {
return window.require && window.require(s);
};
let exp = {};
let mod = {
const exp = {};
const mod = {
exports: exp
};
const file_content = yield this.app.vault.read(file);
const file_content = yield app.vault.read(file);
const wrapping_fn = window.eval("(function anonymous(require, module, exports){" + file_content + "\n})");
wrapping_fn(req, mod, exp);
const user_function = exp["default"] || mod.exports;
@ -3142,10 +3146,10 @@ var UserScriptFunctions = class {
// src/core/functions/user_functions/UserFunctions.ts
var UserFunctions = class {
constructor(app, plugin) {
constructor(plugin) {
this.plugin = plugin;
this.user_system_functions = new UserSystemFunctions(app, plugin);
this.user_script_functions = new UserScriptFunctions(app, plugin);
this.user_system_functions = new UserSystemFunctions(plugin);
this.user_script_functions = new UserScriptFunctions(plugin);
}
generate_object(config2) {
return __async(this, null, function* () {
@ -3155,7 +3159,7 @@ var UserFunctions = class {
user_system_functions = yield this.user_system_functions.generate_object(config2);
}
if (this.plugin.settings.user_scripts_folder) {
user_script_functions = yield this.user_script_functions.generate_object(config2);
user_script_functions = yield this.user_script_functions.generate_object();
}
return __spreadValues(__spreadValues({}, user_system_functions), user_script_functions);
});
@ -3170,11 +3174,10 @@ var FunctionsMode;
FunctionsMode2[FunctionsMode2["USER_INTERNAL"] = 1] = "USER_INTERNAL";
})(FunctionsMode || (FunctionsMode = {}));
var FunctionsGenerator = class {
constructor(app, plugin) {
this.app = app;
constructor(plugin) {
this.plugin = plugin;
this.internal_functions = new InternalFunctions(this.app, this.plugin);
this.user_functions = new UserFunctions(this.app, this.plugin);
this.internal_functions = new InternalFunctions(this.plugin);
this.user_functions = new UserFunctions(this.plugin);
}
init() {
return __async(this, null, function* () {
@ -3750,10 +3753,9 @@ var RunMode;
RunMode2[RunMode2["StartupTemplate"] = 5] = "StartupTemplate";
})(RunMode || (RunMode = {}));
var Templater = class {
constructor(app, plugin) {
this.app = app;
constructor(plugin) {
this.plugin = plugin;
this.functions_generator = new FunctionsGenerator(this.app, this.plugin);
this.functions_generator = new FunctionsGenerator(this.plugin);
this.parser = new Parser();
}
setup() {
@ -3763,7 +3765,7 @@ var Templater = class {
});
}
create_running_config(template_file, target_file, run_mode) {
const active_file = this.app.workspace.getActiveFile();
const active_file = app.workspace.getActiveFile();
return {
template_file,
target_file,
@ -3773,7 +3775,7 @@ var Templater = class {
}
read_and_parse_template(config2) {
return __async(this, null, function* () {
const template_content = yield this.app.vault.read(config2.template_file);
const template_content = yield app.vault.read(config2.template_file);
return this.parse_template(config2, template_content);
});
}
@ -3788,26 +3790,26 @@ var Templater = class {
create_new_note_from_template(template, folder, filename, open_new_note = true) {
return __async(this, null, function* () {
if (!folder) {
const new_file_location = this.app.vault.getConfig("newFileLocation");
const new_file_location = app.vault.getConfig("newFileLocation");
switch (new_file_location) {
case "current": {
const active_file = this.app.workspace.getActiveFile();
const active_file = app.workspace.getActiveFile();
if (active_file) {
folder = active_file.parent;
}
break;
}
case "folder":
folder = this.app.fileManager.getNewFileParent("");
folder = app.fileManager.getNewFileParent("");
break;
case "root":
folder = this.app.vault.getRoot();
folder = app.vault.getRoot();
break;
default:
break;
}
}
const created_note = yield this.app.fileManager.createNewMarkdownFile(folder, filename != null ? filename : "Untitled");
const created_note = yield app.fileManager.createNewMarkdownFile(folder, filename != null ? filename : "Untitled");
let running_config;
let output_content;
if (template instanceof import_obsidian13.TFile) {
@ -3822,16 +3824,16 @@ var Templater = class {
}), "Template parsing error, aborting.");
}
if (output_content == null) {
yield this.app.vault.delete(created_note);
yield app.vault.delete(created_note);
return;
}
yield this.app.vault.modify(created_note, output_content);
this.app.workspace.trigger("templater:new-note-from-template", {
yield app.vault.modify(created_note, output_content);
app.workspace.trigger("templater:new-note-from-template", {
file: created_note,
content: output_content
});
if (open_new_note) {
const active_leaf = this.app.workspace.getLeaf(false);
const active_leaf = app.workspace.getLeaf(false);
if (!active_leaf) {
log_error(new TemplaterError("No active leaf"));
return;
@ -3849,7 +3851,7 @@ var Templater = class {
}
append_template_to_active_file(template_file) {
return __async(this, null, function* () {
const active_view = this.app.workspace.getActiveViewOfType(import_obsidian13.MarkdownView);
const active_view = app.workspace.getActiveViewOfType(import_obsidian13.MarkdownView);
if (active_view === null) {
log_error(new TemplaterError("No active view, can't append templates."));
return;
@ -3865,7 +3867,7 @@ var Templater = class {
const doc = editor.getDoc();
const oldSelections = doc.listSelections();
doc.replaceSelection(output_content);
this.app.workspace.trigger("templater:template-appended", {
app.workspace.trigger("templater:template-appended", {
view: active_view,
content: output_content,
oldSelections,
@ -3883,8 +3885,8 @@ var Templater = class {
if (output_content == null) {
return;
}
yield this.app.vault.modify(file, output_content);
this.app.workspace.trigger("templater:new-note-from-template", {
yield app.vault.modify(file, output_content);
app.workspace.trigger("templater:new-note-from-template", {
file,
content: output_content
});
@ -3892,7 +3894,7 @@ var Templater = class {
});
}
overwrite_active_file_commands() {
const active_view = this.app.workspace.getActiveViewOfType(import_obsidian13.MarkdownView);
const active_view = app.workspace.getActiveViewOfType(import_obsidian13.MarkdownView);
if (active_view === null) {
log_error(new TemplaterError("Active view is null, can't overwrite content"));
return;
@ -3908,8 +3910,8 @@ var Templater = class {
if (output_content == null) {
return;
}
yield this.app.vault.modify(file, output_content);
this.app.workspace.trigger("templater:overwrite-file", {
yield app.vault.modify(file, output_content);
app.workspace.trigger("templater:overwrite-file", {
file,
content: output_content
});
@ -3925,9 +3927,10 @@ var Templater = class {
let functions_object;
while (node = walker.nextNode()) {
let content = node.nodeValue;
let match;
if ((match = dynamic_command_regex.exec(content)) != null) {
const file = this.app.metadataCache.getFirstLinkpathDest("", ctx.sourcePath);
if (content !== null) {
let match = dynamic_command_regex.exec(content);
if (match !== null) {
const file = app.metadataCache.getFirstLinkpathDest("", ctx.sourcePath);
if (!file || !(file instanceof import_obsidian13.TFile)) {
return;
}
@ -3937,6 +3940,7 @@ var Templater = class {
functions_object = yield this.functions_generator.generate_object(config2, FunctionsMode.USER_INTERNAL);
this.current_functions_object = functions_object;
}
}
while (match != null) {
const complete_command = match[1] + match[2];
const command_output = yield errorWrapper(() => __async(this, null, function* () {
@ -3981,7 +3985,7 @@ var Templater = class {
return;
}
const template_file = yield errorWrapper(() => __async(this, null, function* () {
return resolve_tfile(templater.app, folder_template_match);
return resolve_tfile(folder_template_match);
}), `Couldn't find template ${folder_template_match}`);
if (template_file == null) {
return;
@ -3998,7 +4002,7 @@ var Templater = class {
if (!template) {
continue;
}
const file = errorWrapperSync(() => resolve_tfile(this.app, template), `Couldn't find startup template "${template}"`);
const file = errorWrapperSync(() => resolve_tfile(template), `Couldn't find startup template "${template}"`);
if (!file) {
continue;
}
@ -4014,14 +4018,13 @@ var Templater = class {
// src/handlers/EventHandler.ts
var import_obsidian14 = __toModule(require("obsidian"));
var EventHandler = class {
constructor(app, plugin, templater, settings) {
this.app = app;
constructor(plugin, templater, settings) {
this.plugin = plugin;
this.templater = templater;
this.settings = settings;
}
setup() {
this.app.workspace.onLayoutReady(() => {
app.workspace.onLayoutReady(() => {
this.update_trigger_file_on_creation();
});
this.update_syntax_highlighting();
@ -4029,35 +4032,35 @@ var EventHandler = class {
}
update_syntax_highlighting() {
if (this.plugin.settings.syntax_highlighting) {
this.syntax_highlighting_event = this.app.workspace.on("codemirror", (cm) => {
this.syntax_highlighting_event = app.workspace.on("codemirror", (cm) => {
cm.setOption("mode", "templater");
});
this.app.workspace.iterateCodeMirrors((cm) => {
app.workspace.iterateCodeMirrors((cm) => {
cm.setOption("mode", "templater");
});
this.plugin.registerEvent(this.syntax_highlighting_event);
} else {
if (this.syntax_highlighting_event) {
this.app.vault.offref(this.syntax_highlighting_event);
app.vault.offref(this.syntax_highlighting_event);
}
this.app.workspace.iterateCodeMirrors((cm) => {
app.workspace.iterateCodeMirrors((cm) => {
cm.setOption("mode", "hypermd");
});
}
}
update_trigger_file_on_creation() {
if (this.settings.trigger_on_file_creation) {
this.trigger_on_file_creation_event = this.app.vault.on("create", (file) => Templater.on_file_creation(this.templater, file));
this.trigger_on_file_creation_event = app.vault.on("create", (file) => Templater.on_file_creation(this.templater, file));
this.plugin.registerEvent(this.trigger_on_file_creation_event);
} else {
if (this.trigger_on_file_creation_event) {
this.app.vault.offref(this.trigger_on_file_creation_event);
app.vault.offref(this.trigger_on_file_creation_event);
this.trigger_on_file_creation_event = void 0;
}
}
}
update_file_menu() {
this.plugin.registerEvent(this.app.workspace.on("file-menu", (menu, file) => {
this.plugin.registerEvent(app.workspace.on("file-menu", (menu, file) => {
if (file instanceof import_obsidian14.TFolder) {
menu.addItem((item) => {
item.setTitle("Create new note from template").setIcon("templater-icon").onClick(() => {
@ -4071,8 +4074,7 @@ var EventHandler = class {
// src/handlers/CommandHandler.ts
var CommandHandler = class {
constructor(app, plugin) {
this.app = app;
constructor(plugin) {
this.plugin = plugin;
}
setup() {
@ -4144,7 +4146,7 @@ var CommandHandler = class {
id: new_template,
name: `Insert ${new_template}`,
callback: () => {
const template = errorWrapperSync(() => resolve_tfile(this.app, new_template), `Couldn't find the template file associated with this hotkey`);
const template = errorWrapperSync(() => resolve_tfile(new_template), `Couldn't find the template file associated with this hotkey`);
if (!template) {
return;
}
@ -4155,7 +4157,7 @@ var CommandHandler = class {
}
remove_template_hotkey(template) {
if (template) {
this.app.commands.removeCommand(`${this.plugin.manifest.id}:${template}`);
app.commands.removeCommand(`${this.plugin.manifest.id}:${template}`);
}
}
};
@ -4166,21 +4168,20 @@ var import_obsidian17 = __toModule(require("obsidian"));
// src/editor/CursorJumper.ts
var import_obsidian15 = __toModule(require("obsidian"));
var CursorJumper = class {
constructor(app) {
this.app = app;
constructor() {
}
jump_to_next_cursor_location() {
return __async(this, null, function* () {
const active_view = this.app.workspace.getActiveViewOfType(import_obsidian15.MarkdownView);
const active_view = app.workspace.getActiveViewOfType(import_obsidian15.MarkdownView);
if (!active_view) {
return;
}
const active_file = active_view.file;
yield active_view.save();
const content = yield this.app.vault.read(active_file);
const content = yield app.vault.read(active_file);
const { new_content, positions } = this.replace_and_get_cursor_positions(content);
if (positions) {
yield this.app.vault.modify(active_file, new_content);
yield app.vault.modify(active_file, new_content);
this.set_cursor_location(positions);
}
});
@ -4207,7 +4208,7 @@ var CursorJumper = class {
return {};
}
cursor_matches.sort((m1, m2) => {
return Number(m1.groups["order"]) - Number(m2.groups["order"]);
return Number(m1.groups && m1.groups["order"]) - Number(m2.groups && m2.groups["order"]);
});
const match_str = cursor_matches[0][0];
cursor_matches = cursor_matches.filter((m) => {
@ -4227,7 +4228,7 @@ var CursorJumper = class {
return { new_content: content, positions };
}
set_cursor_location(positions) {
const active_view = this.app.workspace.getActiveViewOfType(import_obsidian15.MarkdownView);
const active_view = app.workspace.getActiveViewOfType(import_obsidian15.MarkdownView);
if (!active_view) {
return;
}
@ -4251,7 +4252,16 @@ var tp = { config: { name: "config", description: "This module exposes Templater
var documentation_default = { tp };
// src/editor/TpDocumentation.ts
var module_names = ["config", "date", "file", "frontmatter", "obsidian", "system", "user", "web"];
var module_names = [
"config",
"date",
"file",
"frontmatter",
"obsidian",
"system",
"user",
"web"
];
var module_names_checker = new Set(module_names);
function is_module_name(x) {
return typeof x === "string" && module_names_checker.has(x);
@ -4263,8 +4273,7 @@ function is_function_documentation(x) {
return false;
}
var Documentation = class {
constructor(app) {
this.app = app;
constructor() {
this.documentation = documentation_default;
}
get_all_modules_documentation() {
@ -4272,7 +4281,7 @@ var Documentation = class {
}
get_all_functions_documentation(module_name) {
if (!this.documentation.tp[module_name].functions) {
return null;
return;
}
return Object.values(this.documentation.tp[module_name].functions);
}
@ -4293,25 +4302,23 @@ var Documentation = class {
// src/editor/Autocomplete.ts
var Autocomplete = class extends import_obsidian16.EditorSuggest {
constructor(app, plugin) {
constructor() {
super(app);
this.app = app;
this.plugin = plugin;
this.tp_keyword_regex = /tp\.(?<module>[a-z]*)?(?<fn_trigger>\.(?<fn>[a-z_]*)?)?$/;
this.documentation = new Documentation(this.app);
this.documentation = new Documentation();
}
onTrigger(cursor, editor, file) {
onTrigger(cursor, editor, _file) {
const range = editor.getRange({ line: cursor.line, ch: 0 }, { line: cursor.line, ch: cursor.ch });
const match = this.tp_keyword_regex.exec(range);
if (!match) {
return null;
}
let query;
const module_name = match.groups["module"] || "";
const module_name = match.groups && match.groups["module"] || "";
this.module_name = module_name;
if (match.groups["fn_trigger"]) {
if (match.groups && match.groups["fn_trigger"]) {
if (module_name == "" || !is_module_name(module_name)) {
return;
return null;
}
this.function_trigger = true;
this.function_name = match.groups["fn"] || "";
@ -4350,8 +4357,8 @@ var Autocomplete = class extends import_obsidian16.EditorSuggest {
el.createEl("div", { text: value.description });
}
}
selectSuggestion(value, evt) {
const active_view = this.app.workspace.getActiveViewOfType(import_obsidian16.MarkdownView);
selectSuggestion(value, _evt) {
const active_view = app.workspace.getActiveViewOfType(import_obsidian16.MarkdownView);
if (!active_view) {
return;
}
@ -5641,15 +5648,14 @@ var TP_INTERPOLATION_TAG_TOKEN_CLASS = "templater-interpolation-tag";
var TP_RAW_TAG_TOKEN_CLASS = "templater-raw-tag";
var TP_EXEC_TAG_TOKEN_CLASS = "templater-execution-tag";
var Editor2 = class {
constructor(app, plugin) {
this.app = app;
constructor(plugin) {
this.plugin = plugin;
this.cursor_jumper = new CursorJumper(this.app);
this.cursor_jumper = new CursorJumper();
}
setup() {
return __async(this, null, function* () {
yield this.registerCodeMirrorMode();
this.plugin.registerEditorSuggest(new Autocomplete(this.app, this.plugin));
this.plugin.registerEditorSuggest(new Autocomplete(app));
});
}
jump_to_next_cursor_location(file = null, auto_jump = false) {
@ -5657,7 +5663,7 @@ var Editor2 = class {
if (auto_jump && !this.plugin.settings.auto_jump_to_cursor) {
return;
}
if (file && this.app.workspace.getActiveFile() !== file) {
if (file && app.workspace.getActiveFile() !== file) {
return;
}
yield this.cursor_jumper.jump_to_next_cursor_location();
@ -5719,7 +5725,7 @@ var Editor2 = class {
state.tag_class = "";
return `line-${TP_INLINE_CLASS} ${TP_CMD_TOKEN_CLASS} ${TP_CLOSING_TAG_TOKEN_CLASS} ${tag_class}`;
}
const js_result = js_mode.token(stream, state);
const js_result = js_mode.token && js_mode.token(stream, state);
if (stream.peek() == null && state.freeLine) {
keywords += ` line-background-templater-command-bg`;
}
@ -5760,14 +5766,14 @@ var TemplaterPlugin = class extends import_obsidian18.Plugin {
onload() {
return __async(this, null, function* () {
yield this.load_settings();
this.templater = new Templater(this.app, this);
this.templater = new Templater(this);
yield this.templater.setup();
this.editor_handler = new Editor2(this.app, this);
this.editor_handler = new Editor2(this);
yield this.editor_handler.setup();
this.fuzzy_suggester = new FuzzySuggester(this.app, this);
this.event_handler = new EventHandler(this.app, this, this.templater, this.settings);
this.fuzzy_suggester = new FuzzySuggester(this);
this.event_handler = new EventHandler(this, this.templater, this.settings);
this.event_handler.setup();
this.command_handler = new CommandHandler(this.app, this);
this.command_handler = new CommandHandler(this);
this.command_handler.setup();
(0, import_obsidian18.addIcon)("templater-icon", ICON_DATA);
if (this.settings.enable_ribbon_icon) {
@ -5775,8 +5781,8 @@ var TemplaterPlugin = class extends import_obsidian18.Plugin {
this.fuzzy_suggester.insert_template();
})).setAttribute("id", "rb-templater-icon");
}
this.addSettingTab(new TemplaterSettingTab(this.app, this));
this.app.workspace.onLayoutReady(() => {
this.addSettingTab(new TemplaterSettingTab(this));
app.workspace.onLayoutReady(() => {
this.templater.execute_startup_scripts();
});
});

@ -1,7 +1,7 @@
{
"id": "templater-obsidian",
"name": "Templater",
"version": "1.14.1",
"version": "1.14.3",
"description": "Create and use templates",
"minAppVersion": "0.11.13",
"author": "SilentVoid",

@ -4,7 +4,7 @@
"type": "split",
"children": [
{
"id": "d7214829bae5fc41",
"id": "ab8726a1d7042b76",
"type": "leaf",
"state": {
"type": "markdown",
@ -141,35 +141,35 @@
}
},
{
"id": "e617fe6736b3bd7c",
"id": "c25e04fe97bc025c",
"type": "leaf",
"state": {
"type": "DICE_ROLLER_VIEW",
"type": "metatable-sidebar-view",
"state": {}
}
},
{
"id": "c25e04fe97bc025c",
"id": "a9a5a5427d736b95",
"type": "leaf",
"state": {
"type": "metatable-sidebar-view",
"type": "DICE_ROLLER_VIEW",
"state": {}
}
}
],
"currentTab": 6
"currentTab": 2
},
"active": "d7214829bae5fc41",
"active": "ab8726a1d7042b76",
"lastOpenFiles": [
"03.04 Cinematheque/@Cinematheque.md",
"02.02 Paris/Terrass'Hotel.md",
"01.02 Home/@Main Dashboard.md",
"00.01 Admin/Obsidian plugins.md",
"00.01 Admin/Calendars/2022-09-17.md",
"01.02 Home/2021-12-04 MRCK - lil dialogue.md",
"02.03 Zürich/@Restaurants Zürich.md",
"00.01 Admin/Calendars/2022-09-16.md",
"03.04 Cinematheque/A Fistful of Dollars (1964).md",
"00.01 Admin/Calendars/2023-02-11 Mariage Eloi & Zélie.md",
"00.01 Admin/Calendars/2022-10-14 Weekend à GVA.md"
"03.04 Cinematheque/@Cinematheque.md",
"01.01 Life Orga/@Lifestyle.md",
"02.01 London/Ryan Anderson.md",
"02.01 London/Callum Anderson.md",
"02.01 London/Epsom Polo Club.md",
"02.01 London/Ealing Riding School.md",
"02.02 Paris/Paris SG.md",
"02.02 Paris/Le Barn.md"
]
}

@ -78,8 +78,8 @@ style: number
This section does serve for quick memos.
&emsp;
- [ ] 10:50 :couch_and_lamp: [[2022-09-12|Memo]], [[@Lifestyle]]: sofa options at the border 📅 2022-09-17
- [ ] 10:50 :chair: [[2022-09-12|Memo]], [[@Lifestyle]]: armchair options at the border 📆2022-09-17
- [ ] 10:50 :couch_and_lamp: [[2022-09-12|Memo]], [[@Lifestyle]]: sofa options at the border 📅 2022-09-25
- [ ] 10:50 :chair: [[2022-09-12|Memo]], [[@Lifestyle]]: armchair options at the border 📆2022-09-25
- 20:32 [[2022-09-12|Today]], [[Big Shells With Spicy Lamb Sausage and Pistachios]] with Merguez & without pistacchio ^qjxyyl
%% --- %%

@ -79,8 +79,8 @@ This section does serve for quick memos.
&emsp;
- 12:00 Day trip à [[Geneva]] pour le boulot
- [ ] 12:03 :small_airplane: [[2022-09-14|Memo]], [[Geneva]]: reserver un hotel/airbnb pour Geneve 📅 2022-09-18 ^z9fx6n
- [ ] 12:04 :small_airplane: [[2022-09-14|Memo]], [[@@Paris|Paris]]: reserver billets de train + accommodation pour weekend a Paris 📅 2022-09-18 ^38rnfw
- [x] 12:03 :small_airplane: [[2022-09-14|Memo]], [[Geneva]]: reserver un hotel/airbnb pour Geneve 📅 2022-09-18 ✅ 2022-09-19 ^z9fx6n
- [x] 12:04 :small_airplane: [[2022-09-14|Memo]], [[@@Paris|Paris]]: reserver billets de train + accommodation pour weekend a Paris 📅 2022-09-18 ✅ 2022-09-19 ^38rnfw
- 23:17 [[Game of Thrones (20112019)|Game of Thrones]] with my [[MRCK|Boubix]] [[2022-09-14|this day]]
%% --- %%

@ -13,9 +13,9 @@ Stress: 25
FrontHeadBar: 5
EarHeadBar: 30
BackHeadBar: 20
Water: 2.75
Water: 3.85
Coffee: 1
Steps:
Steps: 5281
Ski:
Riding: 1
Racket:
@ -93,6 +93,7 @@ This section does serve for quick memos.
&emsp;
- [[Game of Thrones (20112019)|Game of Thrones]] with my [[MRCK|Boubix]] [[2022-09-17|this day]]
- [[Iroquois]] for brunch with my [[MRCK|Boubix]] [[2022-09-17|this day]]
&emsp;

@ -0,0 +1,11 @@
---
title: ⚽ Lyon - Paris SG (0-1)
allDay: false
startTime: 20:45
endTime: 22:45
date: 2022-09-18
CollapseMetaTable: true
---
[[2022-09-18|this day]], Lyon - [[Paris SG]]: 0-1
Buteurs:: ⚽ Messi

@ -0,0 +1,112 @@
---
Date: 2022-09-18
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 7.5
Happiness: 90
Gratefulness: 90
Stress: 25
FrontHeadBar: 5
EarHeadBar: 30
BackHeadBar: 20
Water: 4.825
Coffee: 2
Steps: 9539
Ski:
Riding: 1
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2022-09-17|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2022-09-19|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2022-09-18Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2022-09-18NSave
&emsp;
# 2022-09-18
&emsp;
> [!summary]+
> Daily note for 2022-09-18
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
- [[Toto]] for lunch with my [[MRCK|Meggi]] [[2022-09-18|this day]]
- [[Polo Park Zürich|Beginners chukkas]] in the same team as [[MRCK|Meggi-mo]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2022-09-18]]
```
&emsp;
&emsp;

@ -0,0 +1,111 @@
---
Date: 2022-09-19
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 6.5
Happiness: 90
Gratefulness: 90
Stress: 30
FrontHeadBar: 5
EarHeadBar: 30
BackHeadBar: 30
Water: 3.125
Coffee: 3
Steps: 6810
Ski:
Riding:
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2022-09-18|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2022-09-20|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2022-09-19Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2022-09-19NSave
&emsp;
# 2022-09-19
&emsp;
> [!summary]+
> Daily note for 2022-09-19
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
- [[Game of Thrones (20112019)|Game of Thrones]] with my [[MRCK|Boubix]] [[2022-09-19|this day]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2022-09-19]]
```
&emsp;
&emsp;

@ -0,0 +1,112 @@
---
Date: 2022-09-20
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep:
Happiness: 90
Gratefulness: 90
Stress: 30
FrontHeadBar: 5
EarHeadBar: 30
BackHeadBar: 30
Water: 3.08
Coffee: 3
Steps:
Ski:
Riding:
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2022-09-19|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2022-09-21|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2022-09-20Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2022-09-20NSave
&emsp;
# 2022-09-20
&emsp;
> [!summary]+
> Daily note for 2022-09-20
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
- 17:54 [[Luigia]] for lunch [[2022-09-20|today]]
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
- [[Game of Thrones (20112019)|Game of Thrones]] with my [[MRCK|Boubix]] [[2022-09-20|this day]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2022-09-20]]
```
&emsp;
&emsp;

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@Professional|Professional]]
Parent:: [[@@Professional|Professional]]
---

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@Professional|Professional]]
Parent:: [[@@Professional|Professional]]
---

@ -54,7 +54,7 @@ style: number
&emsp;
### Master Navigation
### 🧭 Master Navigation
&emsp;
@ -69,7 +69,7 @@ style: number
&emsp;
### Tag Navigation
### 🏷 Tag Navigation
&emsp;
@ -85,7 +85,8 @@ style: number
&emsp;
### TimeStamp check
### ⏲ TimeStamp check
&emsp;
```dataview
@ -100,7 +101,7 @@ style: number
&emsp;
### High Level tasks
### High Level tasks
&emsp;

@ -0,0 +1,77 @@
---
Alias: ["Useful tools"]
Tag: ["Professional", "Tools"]
Date: 2022-09-19
DocType: Professional
Hierarchy: Root2
TimeStamp:
location:
CollapseMetaTable: true
---
Parent:: [[@@Professional|Professional]]
---
&emsp;
```button
name Save
type command
action Save current file
id Save
```
^button-UsefultoolsNSave
&emsp;
# @Useful tools
&emsp;
> [!summary]+
> Note Description
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### 🏗 Organisational
&emsp;
#### 🪖 Office work
- Text editor: [Obsidian](https://obsidian.md/)
- Project management: [Manage Your Teams Projects From Anywhere | Trello](https://trello.com/)
&emsp;
#### 💻 Code & Automation
- Editor: [Visual Studio Code - Code Editing. Redefined](https://code.visualstudio.com/)
&emsp;
---
&emsp;
### 🤝 Client & relationship management
&emsp;
[Find email addresses in seconds • Hunter (Email Hunter)](https://hunter.io/)
&emsp;
&emsp;

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@Professional|Professional]]
Parent:: [[@@Professional|Professional]]
---

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@Professional|Professional]]
Parent:: [[@@Professional|Professional]]
---

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@Professional|Professional]]
Parent:: [[@@Professional|Professional]]
---

@ -13,7 +13,7 @@ CollapseMetaTable: true
---
Parent:: [[@@Life Organisation|Life]], [[@Professional|Professional]]
Parent:: [[@@Life Organisation|Life]], [[@@Professional|Professional]]
Read:: No
---

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@Professional|Professional]]
Parent:: [[@@Professional|Professional]]
---

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@Professional|Professional]], [[MRCK|Meggi-mo]]
Parent:: [[@@Professional|Professional]], [[MRCK|Meggi-mo]]
---

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@Professional|Professional]]
Parent:: [[@@Professional|Professional]]
---

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@Professional|Professional]]
Parent:: [[@@Professional|Professional]]
---

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@News|News]], [[@Professional|Professional]]
Parent:: [[@News|News]], [[@@Professional|Professional]]
---

@ -13,7 +13,7 @@ CollapseMetaTable: true
---
Parent:: [[@News|News]], [[@Professional|Professional]]
Parent:: [[@News|News]], [[@@Professional|Professional]]
Read:: No
---

@ -153,7 +153,7 @@ See [[Internet services|Internet]] section
**UK**
1. [[Epsom Polo Club|EPC]]
2. [Rugby Polo Club](geo:52.33100963781016,-1.2585905491865028) (Molawa) #Sport
2. [Rugby Polo Club](geo:52.33100963781016,-1.2585905491865028) (Molawa) #Horse
&emsp;
&emsp;

@ -56,23 +56,23 @@ style: number
- [x] ☕ Coffee ✅ 2022-03-01
- [x] 🍶 Coke 0 ✅ 2022-03-14
- [x] 🧃 Apfelschorle ✅ 2022-05-07
- [x] 🍊 Morning juice ✅ 2022-08-05
- [ ] 🍊 Morning juice
- [x] 🍿 Snacks ✅ 2022-03-04
- [x] 🍦 Dessert ✅ 2022-08-05
- [x] 🧈 Beurre ✅ 2022-09-12
- [x] 🥯 Bread ✅ 2022-08-05
- [x] 🍦 Dessert ✅ 2022-09-18
- [x] 🧈 Beurre ✅ 2022-09-18
- [x] 🥯 Bread ✅ 2022-09-18
- [x] 🍯 Honey/Jam ✅ 2022-03-31
- [x] 🍫 Nutella ✅ 2022-02-15
- [x] 🍐 Fruit ✅ 2022-09-05
- [x] 🍌 Bananas ✅ 2022-09-05
- [x] 🍅 vegetables ✅ 2022-09-12
- [x] 🧅 onions ✅ 2022-03-31
- [x] 🧄 garlic ✅ 2022-03-01
- [x] 🥚 Eggs ✅ 2022-07-30
- [x] 🧀 Fromage ✅ 2022-07-30
- [x] 🧀 Fromage rapé ✅ 2022-09-12
- [x] 🧄 garlic ✅ 2022-09-18
- [x] 🥚 Eggs ✅ 2022-09-18
- [x] 🧀 Fromage ✅ 2022-09-18
- [x] 🧀 Fromage rapé ✅ 2022-09-18
- [x] 🥩 Cured meat ✅ 2022-08-05
- [x] 🍖 Fresh meat ✅ 2022-09-05
- [x] 🍖 Fresh meat ✅ 2022-09-18
- [x] 🍝 Pasta ✅ 2022-09-12
- [x] 🍚 Rice ✅ 2022-03-31
- [x] 🥔 Potatoes ✅ 2022-08-05

@ -48,7 +48,11 @@ style: number
&emsp;
### Needs
### 🚧 Infos & projects
&emsp;
`$= dv.el('center', '[[Zürich - Practical infos|]]')`
&emsp;
@ -63,25 +67,22 @@ style: number
&emsp;
### Zürich
### 🇨‍🇭 Zürich
&emsp;
`$= dv.el('center', '[[Zürich - Practical infos|]]')`
&emsp;
#### Garbage collection
#### 🚮 Garbage collection
- [ ] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2022-09-27
- [x] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2022-09-13 ✅ 2022-09-12
- [x] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2022-08-30 ✅ 2022-08-29
- [ ] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2022-09-20
- [ ] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2022-10-04
- [x] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2022-09-20 ✅ 2022-09-19
- [x] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2022-09-06 ✅ 2022-09-05
&emsp;
#### House chores
#### 🏠 House chores
- [ ] 🛎 🛍 REMINDER [[Household]]: Monthly shop in France %%done_del%% 🔁 every month on the last Saturday 🛫 2022-08-29 📅 2022-09-24
- [x] 🛎 🛍 REMINDER [[Household]]: Monthly shop in France %%done_del%% 🔁 every month on the last Saturday 🛫 2022-08-01 📅 2022-08-27 ✅ 2022-08-27
@ -90,20 +91,9 @@ style: number
- [x] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2022-09-12 ✅ 2022-09-09
- [x] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2022-09-05 ✅ 2022-09-02
- [x] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2022-08-29 ✅ 2022-08-27
- [ ] :bed: [[Household]] Change bedsheets %%done_del%% 🔁 every 2 weeks on Saturday 📅 2022-09-17
- [ ] :bed: [[Household]] Change bedsheets %%done_del%% 🔁 every 2 weeks on Saturday 📅 2022-10-01
- [x] :bed: [[Household]] Change bedsheets %%done_del%% 🔁 every 2 weeks on Saturday 📅 2022-09-17 ✅ 2022-09-19
- [x] :bed: [[Household]] Change bedsheets %%done_del%% 🔁 every 2 weeks on Saturday 📅 2022-09-03 ✅ 2022-09-04
&emsp;
---
&emsp;
### Completed to-dos
&emsp;
Loret ipsum
&emsp;
&emsp;

@ -45,16 +45,12 @@ style: number
&emsp;
### Zürich
> [!product] League tables
> This section sums up our good finds by what we like across our trips & outings
&emsp;
> [!product] League tables in Zürich
> This section sums up our good finds by what we like in Zürich
&emsp;
#### 🥐 Croissants
### 🥐 Croissants
1. Buchmann Seefeld
2. [[Toto]]
@ -62,7 +58,11 @@ style: number
&emsp;
#### ☕ Coffee
---
&emsp;
### ☕ Coffee
1. [[Monocle]]
2. [[La Stanza]]
@ -76,12 +76,9 @@ style: number
&emsp;
### Paris
### 🥮 Tiramisu
&emsp;
> [!product] League tables in Paris
> This section sums up our good finds by what we like in Paris
&emsp;
&emsp;

@ -4,11 +4,11 @@ kanban-plugin: basic
---
## Lifestyle
## Health
- [ ] # Polo: [[Polo Park Zürich]]<br><br>---<br><br>[[Francisco Podesta]]
- [ ] # Polo: [[Epsom Polo Club]]<br><br>---<br><br>[[Callum Anderson]]<br>[[Ryan Anderson]]
- [ ] # Polo: Iridike<br><br>---
- [ ] # Doctor<br><br>---
- [ ] # Dentist<br><br>---
- [ ] # Optician<br><br>---
## Utilities
@ -18,6 +18,13 @@ kanban-plugin: basic
- [ ] # Phone, TV & Internet: Swisscom<br><br>---<br><br>> [!info] Info<br>> **Payment frequency**: monthly<br>> **Approx amount**: 58.80 CHF<br><br>---<br><br>💵: CH32 3000 0001 8769 3077 7<br>🏦: Swisscom (CH) Ltd
## Lifestyle
- [ ] # Polo: [[Polo Park Zürich]]<br><br>---<br><br>[[Francisco Podesta]]
- [ ] # Polo: [[Epsom Polo Club]]<br><br>---<br><br>[[Callum Anderson]]<br>[[Ryan Anderson]]
- [ ] # Polo: Iridike<br><br>---
%% kanban:settings

@ -1,12 +1,12 @@
---
Alias: [""]
Tag: ["Polo", "London"]
Tag: ["Polo", "London", "Person"]
Date: 2022-09-16
DocType: "Person"
Hierarchy: "NonRoot"
TimeStamp:
location:
location: [51.34378980192966,-0.2915408008813016]
CollapseMetaTable: true
Person:
LastName: Anderson

@ -1,6 +1,6 @@
---
Tag: ["London", "Sport", "Riding"]
Tag: ["London", "Sport", "Horse"]
Date: 2021-10-04
DocType: "Place"
Hierarchy: "NonRoot"
@ -12,6 +12,7 @@ Place:
Location: Ealing
Country: UK
Status: Regular
CollapseMetaTable: true
---

@ -1,7 +1,7 @@
---
Alias: ["EPC"]
Tag: ["London", "Sport", "Polo"]
Tag: ["London", "Sport", "Polo", "Horse"]
Date: 2021-10-04
DocType: "Place"
Hierarchy: "NonRoot"
@ -13,6 +13,7 @@ Place:
Location: Epsom
Country: UK
Status: Regular
CollapseMetaTable: true
---

@ -1,12 +1,12 @@
---
Alias: []
Tag: ["Polo", "London"]
Tag: ["Person", "Polo", "London"]
Date: 2022-09-16
DocType: "Person"
Hierarchy: "NonRoot"
TimeStamp:
location:
location: [51.34378980192966,-0.2915408008813016]
CollapseMetaTable: true
Person:
LastName: Ryan

@ -1,6 +1,6 @@
---
Tag: ["Modern", "EnglishChef"]
Tag: ["Modern", "EnglishChef", "Restaurant"]
Date: 2022-05-21
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: ["Paris", "Lifestyle", "Sport", "Polo"]
Tag: ["Paris", "Lifestyle", "Sport", "Polo", "Horse"]
Date: 2021-10-04
DocType: "Place"
Hierarchy: "NonRoot"
@ -12,6 +12,7 @@ Place:
Location: Essonne
Country: France
Status: Prospect
CollapseMetaTable: true
---

@ -1,6 +1,6 @@
---
Tag: ["Korean", "Barbecue", "Restaurant"]
Tag: ["Korean", "Restaurant", "Barbecue"]
Date: 2021-12-06
DocType: "Place"
Hierarchy: "NonRoot"
@ -13,10 +13,11 @@ Place:
Location: Opéra
Country: France
Status: Tested
CollapseMetaTable: true
---
Parent:: [[@Restaurants Paris|Restaurants in Paris]]
Parent:: [[@@Paris|Paris]], [[@Restaurants Paris|Restaurants in Paris]]
&emsp;

@ -1,6 +1,6 @@
---
Tag: ["Paris", "Lifestyle", "Sport", "Riding"]
Tag: ["Paris", "Lifestyle", "Sport", "Horse"]
Date: 2021-10-04
DocType: "Place"
Hierarchy: "NonRoot"
@ -12,6 +12,7 @@ Place:
Location: Yvelines
Country: France
Status: Tested
CollapseMetaTable: true
---

@ -1,6 +1,6 @@
---
Tag: ["Modern", "Fusion"]
Tag: ["Modern", "Fusion", "Restaurant"]
Date: 2022-05-21
DocType: "Place"
Hierarchy: "NonRoot"

@ -12,6 +12,7 @@ Place:
Location: Yvelines
Country: France
Status: Tested
CollapseMetaTable: true
---

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: [""]
Tag: ["Restaurant"]
Date: 2022-02-26
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: [""]
Tag: ["Restaurant"]
Date: 2022-01-24
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: [""]
Tag: ["Restaurant"]
Date: 2022-08-19
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: ["Sushi"]
Tag: ["Sushi", "Restaurant"]
Date: 2022-02-23
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: ["Brunch"]
Tag: ["Brunch", "Restaurant"]
Date: 2022-04-15
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: ["Traditional", "Primo", "Socondo"]
Tag: ["Traditional", "Primo", "Socondo", "Restaurant"]
Date: 2022-04-16
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: ["Healthy", "Vegan"]
Tag: ["Healthy", "Vegan", "Restaurant"]
Date: 2022-07-16
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: ["Cocktails"]
Tag: ["Cocktails", "Bar"]
Date: 2022-01-24
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,11 +1,11 @@
---
Tag: ["Luxurious", "Quiet"]
Tag: ["Luxurious", "Quiet", "Hotel"]
Date: 2022-08-19
DocType: "Place"
Hierarchy: "NonRoot"
TimeStamp:
location:
location: [47.372768449999995,8.573080642314265]
Place:
Type: ["Hotel", "Restaurant"]
SubType: Modern

@ -1,11 +1,11 @@
---
Tag: ["Polo", "Zürich", "Mallorca"]
Tag: ["Polo", "Zürich", "Mallorca", "Person"]
Date: 2022-09-16
DocType: "Person"
Hierarchy: "NonRoot"
TimeStamp:
location:
location: [47.5324731,8.7327316]
CollapseMetaTable: true
Person:
LastName: Podesta
@ -16,6 +16,7 @@ Person:
Email: "[info@polopark.ch](readdle-spark://compose?recipient=info@polopark.ch&subject=Reservierung)"
Relation: "Polo Manager"
locations:
---
Parent:: [[@@Zürich|Zürich]], [[Polo Park Zürich]]

@ -1,6 +1,6 @@
---
Tag: ["French"]
Tag: ["French", "Coffee"]
Date: 2022-01-23
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: ["Zürich", "Sport", "Riding"]
Tag: ["Zürich", "Sport", "Riding", "Horse"]
Date: 2022-01-08
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: ["Sushi", "Isakaya"]
Tag: ["Sushi", "Isakaya", "Restaurant"]
Date: 2022-07-08
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: [""]
Tag: ["Coffee"]
Date: 2022-01-24
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: ["Snack"]
Tag: ["Snack", "Restaurant"]
Date: 2022-09-04
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: ["FamilyOwned"]
Tag: ["FamilyOwned", "Restaurant"]
Date: 2022-02-20
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: ["Modern"]
Tag: ["Modern", "Restaurant"]
Date: 2022-05-29
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: [""]
Tag: ["Coffee"]
Date: 2022-01-24
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: [""]
Tag: ["Restaurant"]
Date: 2022-08-20
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: ["French"]
Tag: ["French", "Bar"]
Date: 2022-01-24
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: [""]
Tag: ["Restaurant"]
Date: 2022-08-23
DocType: "Place"
Hierarchy: "NonRoot"

@ -0,0 +1,109 @@
---
Tag: ["Italian", "Napolitano", "Restaurant"]
Date: 2022-09-20
DocType: "Place"
Hierarchy: "NonRoot"
TimeStamp:
location: [47.3704056,8.5355364]
Place:
Type: "Restaurant"
SubType: "Napolitan"
Style: "Italian"
Location: Altstadt
Country: CH
Status: Tested
CollapseMetaTable: true
Phone: <a href="tel:+41447002222">+41 (0) 44 700 22 22</a>
Email: "[zurich@luigia.ch](readdle-spark://compose?recipient=zurich@luigia.ch&subject=Reservierung)"
Website: "[Le meilleur de l'Italie | LUIGIA | Restaurants italiens en Suisse](http://luigia.ch/)"
locations:
---
Parent:: [[@@Zürich|Zürich]], [[@Restaurants Zürich|Restaurants in Zürich]]
&emsp;
`= elink("https://waze.com/ul?ll=" + this.location[0] + "%2C" + this.location[1] + "&navigate=yes", "Launch Waze")`
---
&emsp;
```button
name Save
type command
action Save current file
id Save
```
^button-LuigiaSave
&emsp;
# Luigia
&emsp;
> [!summary]+
> Note Description
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### 📇 Contact
&emsp;
> [!address] 🗺
> Talstrasse 61
> 8001 Zürich
> Switzerland
&emsp;
☎️ `= this.Phone`
📧 `= this.Email`
🌐 `= this.Website`
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
Loret ipsum
&emsp;
---
&emsp;
### 🔗 Other activity
&emsp;
```dataview
Table DocType as "Doc type" from [[Luigia]]
where !contains(file.name, "@@Travel")
sort DocType asc
```
&emsp;
&emsp;

@ -1,6 +1,6 @@
---
Tag: ["Fresh"]
Tag: ["Fresh", "Restaurant"]
Date: 2022-07-16
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,6 +1,6 @@
---
Tag: ["Café", "International"]
Tag: ["Café", "International", "Coffee"]
Date: 2022-09-03
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: ["Modern"]
Tag: ["Modern", "Bar"]
Date: 2022-05-29
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: ["Zürich", "Sport", "Polo"]
Tag: ["Zürich", "Sport", "Polo", "Horse"]
Date: 2022-08-20
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: [""]
Tag: ["Restaurant"]
Date: 2022-08-20
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: [""]
Tag: ["Restaurant"]
Date: 2022-02-23
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: [""]
Tag: ["Restaurant"]
Date: 2022-02-26
DocType: "Place"
Hierarchy: "NonRoot"

@ -1,7 +1,7 @@
---
Alias: [""]
Tag: [""]
Tag: ["Restaurant"]
Date: 2022-02-23
DocType: "Place"
Hierarchy: "NonRoot"

@ -12,7 +12,7 @@ CollapseMetaTable: true
TVShow:
Name: "Game of Thrones"
Season: 5
Episode: 1
Episode: 9
Source: Internal
banner: "![[img_1924.jpg]]"
banner_icon: 🍿

@ -290,7 +290,8 @@ Everything is rather self-explanatory.
- [x] [[Server VPN]]: Backup server 🔁 every 6 months on the 1st Tuesday 📅 2021-10-14 ✅ 2022-01-08
- [x] [[Server VPN]]: Backup server 🔁 every 6 months on the 1st Tuesday ✅ 2021-10-13
- [ ] :shield: [[Selfhosting]], [[Server VPN|VPN]]: Check VPN state & dashboard %%done_del%% 🔁 every 3 months 📅 2022-09-18
- [ ] :shield: [[Selfhosting]], [[Server VPN|VPN]]: Check VPN state & dashboard %%done_del%% 🔁 every 3 months 📅 2022-12-18
- [x] :shield: [[Selfhosting]], [[Server VPN|VPN]]: Check VPN state & dashboard %%done_del%% 🔁 every 3 months 📅 2022-09-18 ✅ 2022-09-18
- [x] :shield: [[Selfhosting]], [[Server VPN|VPN]]: Check VPN state & dashboard 🔁 every 3 months 📅 2022-06-18 ✅ 2022-06-20
- [x] [[Selfhosting]], [[Server VPN|VPN]]: Check VPN state & dashboard 🔁 every 3 months 📅 2022-03-18 ✅ 2022-03-18

Loading…
Cancel
Save