vault backup: 2025-04-19 10:18:11

This commit is contained in:
huchuan 2025-04-19 10:18:11 +08:00
parent 602c05f45e
commit 29f073046a
8 changed files with 635 additions and 4 deletions

View File

@ -9,5 +9,6 @@
"obsidian-mind-map", "obsidian-mind-map",
"obsidian-kanban", "obsidian-kanban",
"homepage", "homepage",
"file-tree-alternative" "file-tree-alternative",
"favorite-note"
] ]

View File

@ -0,0 +1,5 @@
{
"icon": "star",
"filled": true,
"favorites": {}
}

536
.obsidian/plugins/favorite-note/main.js vendored Normal file
View File

@ -0,0 +1,536 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/main.ts
var main_exports = {};
__export(main_exports, {
default: () => FavoritePlugin
});
module.exports = __toCommonJS(main_exports);
var import_obsidian6 = require("obsidian");
// src/lib/utils.ts
var import_obsidian = require("obsidian");
function createFavoriteButton(isFavorite = false, icon = "star", fillIcon = false) {
const trailingButton = document.createElement("span");
trailingButton.classList.add("fav-btn");
if (isFavorite) {
trailingButton.classList.add("is-favorite");
if (fillIcon) {
trailingButton.classList.add("fav-icon-filled");
}
} else {
trailingButton.classList.remove("is-favorite");
trailingButton.classList.remove("fav-icon-filled");
}
(0, import_obsidian.setIcon)(trailingButton, icon);
return trailingButton;
}
// src/constants.ts
var DEFAULT_SETTINGS = {
icon: "star",
filled: false,
favorites: /* @__PURE__ */ new Set()
};
var SETTINGS_ICON_BTN_ID = "fv-select-icon-btn";
// src/variants/BasePlugin.ts
var BasePluginContract = class {
};
var BasePlugin = class extends BasePluginContract {
constructor(plugin, app) {
super();
this.isEnabled = false;
this.plugin = plugin;
this.app = app;
this.init();
}
async init() {
await this.loadSettings();
}
async loadSettings() {
this.settings = Object.assign(
{},
DEFAULT_SETTINGS,
await this.plugin.loadData()
);
this.favorites = new Set(Object.values(this.settings.favorites));
}
async saveSettings() {
await this.plugin.saveData({
...this.settings,
favorites: Object.assign({}, Array.from(this.favorites))
});
}
isFavorite(filePath) {
return this.favorites.has(filePath);
}
removeFavorite(filePath) {
this.favorites.delete(filePath);
this.saveSettings();
}
onFileDelete(file) {
this.removeFavorite(file.path);
}
toggleFavorite(filePath) {
if (this.isFavorite(filePath)) {
this.favorites.delete(filePath);
} else {
this.favorites.add(filePath);
}
this.saveSettings();
}
};
// src/variants/DesktopPlugin.ts
var import_obsidian4 = require("obsidian");
// src/tabs/settings-tab.ts
var import_obsidian3 = require("obsidian");
// src/modals/choose-icon-modal.ts
var import_obsidian2 = require("obsidian");
var ChooseFromIconList = class extends import_obsidian2.FuzzySuggestModal {
constructor(plugin, issub = false) {
super(plugin.app);
this.plugin = plugin;
this.issub = issub;
this.setPlaceholder("Choose an icon");
}
capitalJoin(string) {
const icon = string.split(" ");
return icon.map((icon2) => {
return icon2[0].toUpperCase() + icon2.substring(1);
}).join(" ");
}
getItems() {
return (0, import_obsidian2.getIconIds)();
}
getItemText(item) {
return this.capitalJoin(
item.replace("feather-", "").replace("remix-", "").replace("bx-", "").replace(/([A-Z])/g, " $1").trim().replace(/-/gi, " ")
);
}
renderSuggestion(icon, iconItem) {
const span = createSpan({ cls: "fv-icon-item" });
iconItem.appendChild(span);
(0, import_obsidian2.setIcon)(span, icon.item);
super.renderSuggestion(icon, iconItem);
}
async onChooseItem(item) {
this.plugin.variant.settings.icon = item;
(0, import_obsidian2.setIcon)(
document.querySelector(
`#${SETTINGS_ICON_BTN_ID}`
),
item
);
await this.plugin.variant.saveSettings();
this.plugin.variant.reload();
setTimeout(() => {
dispatchEvent(new Event("print-greeting-to-console"));
}, 100);
}
};
// src/tabs/settings-tab.ts
var FavoritePluginSettingsTab = class extends import_obsidian3.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
new import_obsidian3.Setting(containerEl).setName("Favorite Icon").setDesc("Choose your favorite icon").addButton((el) => {
el.setIcon(this.plugin.variant.settings.icon);
el.onClick(async () => {
new ChooseFromIconList(this.plugin, false).open();
});
this.plugin.variant.saveSettings();
}).controlEl.children[0].setAttr("id", SETTINGS_ICON_BTN_ID);
new import_obsidian3.Setting(containerEl).setName("Fill Icon").setDesc("If you want to fill the icon or not").addToggle((el) => {
el.setValue(this.plugin.variant.settings.filled);
el.onChange(async (value) => {
this.plugin.variant.settings.filled = value;
this.plugin.variant.saveSettings();
this.plugin.variant.reload();
});
});
const donationDiv = containerEl.createEl("div", {
cls: "donate-section"
});
const donateText = createEl("p", {
text: "If you like this Plugin and are considering donating to support continued development, use the button below!"
});
donationDiv.appendChild(donateText);
donationDiv.appendChild(
this.createDonateButton("https://www.buymeacoffee.com/mahmudz")
);
}
createDonateButton(link) {
const a = createEl("a");
a.setAttribute("href", link);
a.addClass("buymeacoffee-img");
const img = createEl("img", {
attr: {
src: "https://img.buymeacoffee.com/button-api/?text=Buy me a coffee &emoji=&slug=mahmudz&button_colour=BD5FFF&font_colour=ffffff&font_family=Poppins&outline_colour=000000&coffee_colour=FFDD00"
}
});
a.appendChild(img);
return a;
}
};
// src/variants/DesktopPlugin.ts
var DesktopPlugin = class extends BasePlugin {
getFileExplorer() {
return this.app.workspace.containerEl.find(".nav-files-container");
}
onFolderExpand(e) {
if (this.isEnabled) {
this.addFavoriteIconToFolder(e.currentTarget);
} else {
const parentElement = e.currentTarget;
this.removeFavoriteIconFromChild(parentElement);
}
}
addFavoriteIconToItem(listItem) {
var _a;
const filePath = (_a = listItem.getAttribute("data-path")) != null ? _a : "";
const trailingButton = createFavoriteButton(
this.isFavorite(filePath),
this.settings.icon,
this.settings.filled
);
trailingButton.addEventListener("click", (e) => {
const favoriteButton = e.currentTarget;
if (favoriteButton) {
const titleEl = favoriteButton.parentElement;
const filePath2 = titleEl.getAttribute("data-path");
this.toggleFavorite(filePath2);
if (this.isFavorite(filePath2)) {
favoriteButton.classList.add("is-favorite");
if (this.settings.filled) {
trailingButton.classList.add("fav-icon-filled");
}
} else {
favoriteButton.classList.remove("is-favorite");
trailingButton.classList.remove("fav-icon-filled");
}
}
});
listItem.appendChild(trailingButton);
}
addFavoriteIconToFolder(folderEl) {
const listItems = folderEl.querySelectorAll(
".nav-folder, .nav-file-title"
);
listItems.forEach((listItem) => {
const isAlreadyExists = listItem.find(".fav-btn");
if (isAlreadyExists) {
return;
}
if (listItem.classList.contains("nav-file-title")) {
listItem.addClass("fav-nav-file-title");
this.addFavoriteIconToItem(listItem);
} else if (!listItem.classList.contains("is-collapsed")) {
setTimeout(() => {
this.addFavoriteIconToFolder(listItem);
}, 200);
} else {
listItem.addEventListener(
"click",
this.onFolderExpand.bind(this),
{ once: true }
);
}
});
}
addFavoriteIcons() {
const parent = this.getFileExplorer();
if (parent) {
this.addFavoriteIconToFolder(parent);
}
}
removeFavoriteIconFromChild(folderEl) {
const listItems = folderEl.querySelectorAll(
".nav-folder, .nav-file-title"
);
listItems.forEach((listItem) => {
if (listItem.classList.contains("nav-file-title")) {
listItem.findAll(".fav-btn").forEach((el) => el.remove());
listItem.removeClass("fav-nav-file-title");
} else {
this.removeFavoriteIconFromChild(listItem);
}
});
}
removeFavoriteIcons() {
const fileExplorer = this.getFileExplorer();
if (fileExplorer) {
this.removeFavoriteIconFromChild(fileExplorer);
}
}
reload() {
this.removeFavoriteIcons();
this.addFavoriteIcons();
}
onFileCreate(file) {
setTimeout(() => {
const listItem = this.app.workspace.containerEl.find(
`[data-path="${file.path}"]`
);
listItem.classList.add("fav-nav-file-title");
this.addFavoriteIconToItem(listItem);
}, 100);
}
async onload() {
this.isEnabled = true;
this.app.workspace.onLayoutReady(async () => {
if (import_obsidian4.Platform.isTablet || import_obsidian4.Platform.isDesktop) {
setTimeout(() => {
var _a;
this.addFavoriteIcons();
(_a = this.getFileExplorer()) == null ? void 0 : _a.findAll(".nav-file-title").forEach((el) => {
el.classList.add("fav-nav-file-title");
});
}, 300);
this.app.vault.on("create", this.onFileCreate.bind(this));
this.app.vault.on("delete", this.onFileDelete.bind(this));
}
});
this.plugin.addSettingTab(
new FavoritePluginSettingsTab(
this.app,
this.plugin
)
);
}
destroy() {
var _a;
this.isEnabled = false;
(_a = this.getFileExplorer()) == null ? void 0 : _a.findAll(".nav-file-title").forEach((el) => {
el.classList.remove("fav-nav-file-title");
});
this.app.vault.off("create", this.onFileCreate.bind(this));
this.app.vault.off("delete", this.onFileDelete.bind(this));
this.removeFavoriteIcons();
}
};
// src/variants/MobilePlugin.ts
var import_obsidian5 = require("obsidian");
var MobilePlugin = class extends BasePlugin {
constructor() {
super(...arguments);
this.onSidebarButtonClick = () => {
const explorer = this.getFileExplorer();
if (!this.app.workspace.leftSplit.collapsed) {
setTimeout(() => {
this.addFavoriteIconToFolder(explorer);
}, 50);
}
};
}
getFileListElements(parentEl) {
return parentEl.querySelectorAll(".nav-folder, .nav-file-title");
}
getFileExplorer() {
var _a;
return (_a = this.app.workspace.getLeavesOfType("file-explorer").pop()) == null ? void 0 : _a.view.containerEl;
}
removeFavoriteIconFromChild(folderEl) {
const listItems = this.getFileListElements(folderEl);
listItems.forEach((listItem) => {
if (listItem.classList.contains("nav-file-title")) {
listItem.findAll(".mobile-fav-btn").forEach((el) => el.remove());
listItem.removeClass("fav-nav-file-title");
} else {
this.removeFavoriteIconFromChild(listItem);
}
});
}
createFavoriteButton(isFavorite = false) {
const trailingButton = document.createElement("span");
trailingButton.classList.add("mobile-fav-btn");
if (isFavorite) {
trailingButton.classList.add("is-favorite");
} else {
trailingButton.classList.remove("is-favorite");
}
(0, import_obsidian5.setIcon)(trailingButton, this.settings.icon);
return trailingButton;
}
addFavoriteIconToItem(listItem) {
var _a;
const favButton = listItem.find(".mobile-fav-btn");
const filePath = (_a = listItem.getAttribute("data-path")) != null ? _a : "";
const favorite = this.isFavorite(filePath);
if (favButton) {
if (favorite) {
favButton.classList.add("is-favorite");
} else {
favButton.classList.remove("is-favorite");
}
return;
}
listItem.addClass("fav-nav-file-title");
const trailingButton = this.createFavoriteButton(favorite);
listItem.appendChild(trailingButton);
}
addFavoriteIconToFolder(folderEl) {
const listItems = this.getFileListElements(folderEl);
listItems.forEach((listItem) => {
if (listItem.classList.contains("nav-file-title")) {
this.addFavoriteIconToItem(listItem);
} else {
this.addFavoriteIconToFolder(listItem);
}
});
}
getHeaderFavoriteActionButton() {
const itemView = this.app.workspace.getActiveViewOfType(import_obsidian5.ItemView);
return itemView == null ? void 0 : itemView.containerEl.querySelector(
'.clickable-icon.view-action[aria-label="Favorite"]'
);
}
itemViewAlreadyHasButton() {
return this.getHeaderFavoriteActionButton() != null;
}
getSidebarToggleButton() {
var _a, _b, _c;
if (import_obsidian5.Platform.isTablet) {
return (_a = this.app.workspace.containerEl) == null ? void 0 : _a.querySelector(
".sidebar-toggle-button"
);
}
return (_c = (_b = this.app.workspace.getActiveViewOfType(import_obsidian5.ItemView)) == null ? void 0 : _b.containerEl) == null ? void 0 : _c.querySelector(
'button[aria-label="Expand"]'
);
}
registerSidebarToggleEvents() {
const btn = this.getSidebarToggleButton();
btn == null ? void 0 : btn.addEventListener("click", this.onSidebarButtonClick);
}
deregisterSidebarToggleEvents() {
const btn = this.getSidebarToggleButton();
btn == null ? void 0 : btn.removeEventListener("click", this.onSidebarButtonClick);
}
updateHeaderButtonState() {
var _a;
const filePath = (_a = this.app.workspace.getActiveFile()) == null ? void 0 : _a.path;
const btn = this.getHeaderFavoriteActionButton();
if (this.isFavorite(filePath)) {
btn == null ? void 0 : btn.classList.remove("mobile-header-fav-idle");
btn == null ? void 0 : btn.classList.add("is-favorite");
} else {
btn == null ? void 0 : btn.classList.remove("is-favorite");
btn == null ? void 0 : btn.classList.add("mobile-header-fav-idle");
}
}
onHeaderButtonClick() {
var _a;
const filePath = (_a = this.app.workspace.getActiveFile()) == null ? void 0 : _a.path;
if (!filePath) {
return;
}
this.toggleFavorite(filePath);
this.updateHeaderButtonState();
}
addFavoriteButtonToHeader() {
var _a;
const filePath = (_a = this.app.workspace.getActiveFile()) == null ? void 0 : _a.path;
if (!filePath) {
return;
}
const itemView = this.app.workspace.getActiveViewOfType(import_obsidian5.ItemView);
const action = itemView == null ? void 0 : itemView.addAction(
this.settings.icon,
"Favorite",
this.onHeaderButtonClick.bind(this)
);
action == null ? void 0 : action.classList.add(
this.isFavorite(filePath) ? "is-favorite" : "mobile-header-fav-idle"
);
}
onload() {
this.app.workspace.on("window-open", () => {
console.log("open");
});
this.app.workspace.onLayoutReady(() => {
setTimeout(() => {
this.addFavoriteButtonToHeader();
this.registerSidebarToggleEvents();
this.onSidebarButtonClick();
}, 100);
this.plugin.registerEvent(
this.app.workspace.on("active-leaf-change", (leaf) => {
if (!this.itemViewAlreadyHasButton()) {
this.addFavoriteButtonToHeader();
}
this.updateHeaderButtonState();
})
);
this.plugin.registerEvent(
this.app.vault.on("delete", this.onFileDelete.bind(this))
);
});
}
reload() {
}
destroy() {
var _a, _b;
this.isEnabled = false;
(_a = this.getHeaderFavoriteActionButton()) == null ? void 0 : _a.remove();
this.deregisterSidebarToggleEvents();
(_b = this.getFileExplorer()) == null ? void 0 : _b.findAll(".nav-file-title").forEach((el) => {
el.classList.remove("fav-nav-file-title");
el.find(".mobile-fav-btn").remove();
});
}
};
// src/main.ts
var FavoritePlugin = class extends import_obsidian6.Plugin {
constructor(app, manifest) {
super(app, manifest);
if (import_obsidian6.Platform.isDesktop) {
this.variant = new DesktopPlugin(this, this.app);
}
if (import_obsidian6.Platform.isMobile) {
this.variant = new MobilePlugin(this, this.app);
}
}
onload() {
var _a;
(_a = this.variant) == null ? void 0 : _a.onload();
}
onunload() {
var _a;
(_a = this.variant) == null ? void 0 : _a.destroy();
}
};
/* nosourcemap */

View File

@ -0,0 +1,11 @@
{
"id": "favorite-note",
"name": "Favorite Note",
"version": "2.0.3",
"minAppVersion": "0.15.0",
"description": "Mark your note as favorite.",
"author": "mahmudz",
"authorUrl": "https://github.com/mahmudz",
"fundingUrl": "https://www.buymeacoffee.com/mahmudz",
"isDesktopOnly": false
}

View File

@ -0,0 +1,78 @@
/*
This CSS file will be included with your plugin, and
available in the app when your plugin is enabled.
If your plugin does not need CSS, delete this file.
*/
.fav-nav-file-title {
display: flex;
align-items: center;
justify-content: space-between;
gap: 5px;
}
.nav-file-title-content,
.nav-folder-title-content {
flex: 1;
}
.fav-btn {
visibility: hidden;
cursor: pointer;
display: flex;
}
.fav-btn:hover {
color: #9f9f9f;
}
.fav-btn svg.svg-icon {
height: 16px;
width: 16px;
}
.fav-icon-filled svg {
fill: var(--text-accent);
}
.nav-file:hover .fav-btn {
visibility: visible;
}
.mobile-header-fav-idle {
color: var(--text-faint);
}
.mobile-fav-btn {
cursor: pointer;
display: flex;
visibility: hidden;
}
.is-favorite {
visibility: visible;
color: var(--text-accent);
}
.is-favorite:hover {
visibility: visible;
color: var(--text-accent-hover);
}
.donate-section {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding-top: 40px;
}
.fv-icon-item {
line-height: normal;
vertical-align: middle;
margin-right: 8px;
}

View File

@ -2,7 +2,7 @@
"openViewOnStart": true, "openViewOnStart": true,
"ribbonIcon": true, "ribbonIcon": true,
"showRootFolder": true, "showRootFolder": true,
"showFilesFromSubFolders": true, "showFilesFromSubFolders": false,
"searchFunction": true, "searchFunction": true,
"allSearchOnlyInFocusedFolder": false, "allSearchOnlyInFocusedFolder": false,
"showFilesFromSubFoldersButton": true, "showFilesFromSubFoldersButton": true,
@ -13,7 +13,7 @@
"folderIcon": "icomoon", "folderIcon": "icomoon",
"folderCount": true, "folderCount": true,
"folderCountOption": "notes", "folderCountOption": "notes",
"evernoteView": "Horizontal", "evernoteView": "Vertical",
"filePreviewOnHover": false, "filePreviewOnHover": false,
"iconBeforeFileName": true, "iconBeforeFileName": true,
"sortFilesBy": "name", "sortFilesBy": "name",

View File

@ -1,4 +1,4 @@
[[000整体看板]] [[000整体看板]]
[[3月日记]] [[3月日记]]
[[看板]] [[看板]]
[[4月日记]] [[4月日记]]