mirror of
https://github.com/antokeinanen/obsidian-advanced-merger.git
synced 2026-07-22 07:40:24 +00:00
Merge pull request #2 from EndarValuk/feature/SORT-FILES-BY-NAME
Feature/Sorting improvements
This commit is contained in:
commit
f2e03dc3d4
3 changed files with 192 additions and 51 deletions
|
|
@ -37,6 +37,7 @@ const context = await esbuild.context({
|
||||||
logLevel: "info",
|
logLevel: "info",
|
||||||
sourcemap: prod ? false : "inline",
|
sourcemap: prod ? false : "inline",
|
||||||
treeShaking: true,
|
treeShaking: true,
|
||||||
|
minify: true,
|
||||||
outfile: "main.js",
|
outfile: "main.js",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -45,4 +46,4 @@ if (prod) {
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
} else {
|
} else {
|
||||||
await context.watch();
|
await context.watch();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
238
main.ts
238
main.ts
|
|
@ -1,52 +1,192 @@
|
||||||
import { Plugin, TFolder } from "obsidian";
|
import { App, Plugin, PluginSettingTab, Setting, TFile, TFolder } from "obsidian";
|
||||||
|
|
||||||
export default class AdvancedMerge extends Plugin {
|
const TRANSLATIONS: { [name: string]: { [name: string]: string } } = {
|
||||||
onload() {
|
de: {
|
||||||
this.registerEvent(
|
MergeFolder: "Ordner zusammenführen",
|
||||||
this.app.workspace.on("file-menu", (menu, file) => {
|
MergedFilesuffix: "zusammengeführt",
|
||||||
if (file instanceof TFolder) {
|
Settings: "Einstellungen",
|
||||||
const folder = file;
|
SettingSortAlphabetically: "Dateien alphabetisch sortieren",
|
||||||
menu.addItem((item) => {
|
SettingSortAlphabeticallyDescription: "Wenn aktiviert, werden die Dateien im ausgewählten Ordner alphabetisch nach ihrem vollständigen Pfad sortiert. Andernfalls werden die Dateien nach dem Erstellungsdatum sortiert (Standardverhalten).",
|
||||||
item.setTitle("Merge folder")
|
SettingIncludeNestedFolders: "Verschachtelte Ordner einbeziehen",
|
||||||
.setIcon("git-merge")
|
SettingIncludeNestedFoldersDescription: "Wenn aktiviert, werden Dateien in verschachtelten Ordnern zusammengeführt. Andernfalls werden nur Dateien im ausgewählten Ordner zusammengeführt (Standardverhalten)."
|
||||||
.onClick(async () => {
|
},
|
||||||
const { vault } = this.app;
|
en: {
|
||||||
|
MergeFolder: "Merge folder",
|
||||||
const files = vault
|
MergedFilesuffix: "merged",
|
||||||
.getMarkdownFiles()
|
Settings: "Settings",
|
||||||
.filter(
|
SettingSortAlphabetically: "Sort files alphabetically",
|
||||||
(file) =>
|
SettingSortAlphabeticallyDescription: "If enabled, files in selected folder will be sorted alphabetically, according to its full path. Otherwise, files will be sorted by creation date (default behaviour).",
|
||||||
file.parent?.path == folder.path
|
SettingIncludeNestedFolders: "Include nested folders",
|
||||||
)
|
SettingIncludeNestedFoldersDescription: "If enabled, files in nested folders will be included in merge. Otherwise, only files in selected folder will be merged (default behaviour)."
|
||||||
.sort((a, b) => {
|
},
|
||||||
const x = a.path.toLowerCase();
|
fi: {
|
||||||
const y = b.path.toLowerCase();
|
MergeFolder: "Yhdistä kansio",
|
||||||
if (x < y) {
|
MergedFilesuffix: "yhdistetty",
|
||||||
return -1;
|
Settings: "Asetukset",
|
||||||
}
|
SettingSortAlphabetically: "Lajittele tiedostot aakkosjärjestykseen",
|
||||||
if (x > y) {
|
SettingSortAlphabeticallyDescription: "Jos tämä on käytössä, valitun kansion tiedostot lajitellaan aakkosjärjestyksessä sen täyden polun mukaan. Muussa tapauksessa tiedostot lajitellaan luomispäivämäärän mukaan (oletuskäyttäytyminen).",
|
||||||
return 1;
|
SettingIncludeNestedFolders: "Sisällytä sisäkkäiset kansiot",
|
||||||
}
|
SettingIncludeNestedFoldersDescription: "Jos tämä on käytössä, sisäkkäisten kansioiden tiedostot sisällytetään yhdistämiseen. Muussa tapauksessa vain valitun kansion tiedostot yhdistetään (oletustoiminto)."
|
||||||
return 0;
|
},
|
||||||
});
|
fr: {
|
||||||
|
MergeFolder: "Fusionner le dossier",
|
||||||
const destination = await vault.create(
|
MergedFilesuffix: "fusionné",
|
||||||
`${folder.path}-merged.md`,
|
Settings: "Paramètres",
|
||||||
""
|
SettingSortAlphabetically: "Trier les fichiers par ordre alphabétique",
|
||||||
);
|
SettingSortAlphabeticallyDescription: "Si activé, les fichiers du dossier sélectionné seront triés par ordre alphabétique, en fonction de son chemin complet. Sinon, les fichiers seront triés par date de création (comportement par défaut).",
|
||||||
|
SettingIncludeNestedFolders: "Inclure les dossiers imbriqués",
|
||||||
files.forEach(async (file) => {
|
SettingIncludeNestedFoldersDescription: "Si activé, les fichiers des dossiers imbriqués seront inclus dans la fusion. Sinon, seuls les fichiers du dossier sélectionné seront fusionnés (comportement par défaut)."
|
||||||
let contents = await vault.read(file);
|
},
|
||||||
contents = `\n# ${file.name.replace(
|
ru: {
|
||||||
/\.md$/,
|
MergeFolder: "Объединить папку",
|
||||||
""
|
MergedFilesuffix: "совмещенный",
|
||||||
)}\n${contents}\n`;
|
Settings: "Настройки",
|
||||||
vault.append(destination, contents);
|
SettingSortAlphabetically: "Сортировать файлы по алфавиту",
|
||||||
});
|
SettingSortAlphabeticallyDescription: "Если включено, файлы в выбранной папке будут отсортированы в алфавитном порядке в соответствии с полным путем. В противном случае, файлы будут отсортированы по дате создания (поведение по умолчанию)",
|
||||||
});
|
SettingIncludeNestedFolders: "Влючать вложенные папки",
|
||||||
});
|
SettingIncludeNestedFoldersDescription: "Если включено, файлы во вложенных папках будут включены в слияние. В противном случае будут объединены только файлы в выбранной папке (поведение по умолчанию)."
|
||||||
}
|
},
|
||||||
})
|
ua: {
|
||||||
);
|
MergeFolder: "Об'єднати папку",
|
||||||
|
MergedFilesuffix: "об'єднані",
|
||||||
|
Settings: "Налаштування",
|
||||||
|
SettingSortAlphabetically: "Сортувати файли за алфавітом",
|
||||||
|
SettingSortAlphabeticallyDescription: "Якщо ввімкнено, файли у вибраній папці будуть відсортовані в алфавітному порядку відповідно до повного шляху. В іншому випадку файли будуть відсортовані за датою створення (поведінка за замовчуванням).",
|
||||||
|
SettingIncludeNestedFolders: "Включити вкладені папки",
|
||||||
|
SettingIncludeNestedFoldersDescription: "Якщо ввімкнено, файли у вкладених папках будуть включені в об’єднання. В іншому випадку буде об’єднано лише файли у вибраній папці (поведінка за замовчуванням)."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AdvancedMergePluginSettings {
|
||||||
|
sortAlphabetically: boolean;
|
||||||
|
includeNestedFolders: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
const DEFAULT_SETTINGS: AdvancedMergePluginSettings = {
|
||||||
|
sortAlphabetically: false,
|
||||||
|
includeNestedFolders: false
|
||||||
|
}
|
||||||
|
|
||||||
|
const PLUGIN_NAME = "Advanced Merger";
|
||||||
|
const DEFAULT_LANGUAGE = "en";
|
||||||
|
const HANDLER_LOCATION = "file-menu";
|
||||||
|
|
||||||
|
export default class AdvancedMerge extends Plugin {
|
||||||
|
public language: string;
|
||||||
|
|
||||||
|
public settings: AdvancedMergePluginSettings;
|
||||||
|
|
||||||
|
public async onload(): Promise<void> {
|
||||||
|
this.language = TRANSLATIONS[navigator.language] === null ? DEFAULT_LANGUAGE : navigator.language;
|
||||||
|
|
||||||
|
await this.loadSettings();
|
||||||
|
|
||||||
|
this.registerEvent(
|
||||||
|
this.app.workspace.on(HANDLER_LOCATION, (menu, file) => {
|
||||||
|
if (!(file instanceof TFolder)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const folder = file;
|
||||||
|
menu.addItem((item) => {
|
||||||
|
item.setTitle(TRANSLATIONS[this.language].MergeFolder)
|
||||||
|
.setIcon("git-merge")
|
||||||
|
.onClick(async(evt) => await this.onClickCallback(folder, evt));
|
||||||
|
});
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
// This adds a settings tab so the user can configure various aspects of the plugin
|
||||||
|
this.addSettingTab(new AdvancedMergeSettingTab(this.app, this));
|
||||||
|
}
|
||||||
|
|
||||||
|
private async onClickCallback(folder: TFolder, _evt: MouseEvent | KeyboardEvent): Promise<void> {
|
||||||
|
const { vault } = this.app;
|
||||||
|
|
||||||
|
const files = this.fileSort(
|
||||||
|
vault
|
||||||
|
.getMarkdownFiles()
|
||||||
|
.filter((file) => this.fileFilter(folder, file)));
|
||||||
|
|
||||||
|
const destination = await vault.create(
|
||||||
|
`${folder.path}-${TRANSLATIONS[this.language].MergedFilesuffix}.md`,
|
||||||
|
""
|
||||||
|
);
|
||||||
|
|
||||||
|
files.forEach(async (file) => {
|
||||||
|
let contents = await vault.read(file);
|
||||||
|
contents = `\n# ${file.name.replace(
|
||||||
|
/\.md$/,
|
||||||
|
""
|
||||||
|
)}\n${contents}\n`;
|
||||||
|
vault.append(destination, contents);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private fileFilter(folder: TFolder, file: TFile): boolean {
|
||||||
|
return this.settings.includeNestedFolders ?
|
||||||
|
!!file.parent?.path.startsWith(folder.path)
|
||||||
|
: file.parent?.path == folder.path;
|
||||||
|
}
|
||||||
|
|
||||||
|
private fileSort(files: Array<TFile>): Array<TFile> {
|
||||||
|
return this.settings.sortAlphabetically ?
|
||||||
|
files.sort((a, b) => {
|
||||||
|
const x = a.path.toLowerCase();
|
||||||
|
const y = b.path.toLowerCase();
|
||||||
|
if (x < y) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (x > y) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
})
|
||||||
|
: files.reverse();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async loadSettings(): Promise<void> {
|
||||||
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
||||||
|
}
|
||||||
|
|
||||||
|
public async saveSettings(): Promise<void> {
|
||||||
|
await this.saveData(this.settings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AdvancedMergeSettingTab extends PluginSettingTab {
|
||||||
|
private plugin: AdvancedMerge;
|
||||||
|
|
||||||
|
constructor(app: App, plugin: AdvancedMerge) {
|
||||||
|
super(app, plugin);
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public display(): void {
|
||||||
|
const {containerEl} = this;
|
||||||
|
|
||||||
|
containerEl.empty();
|
||||||
|
|
||||||
|
containerEl.createEl('h2', {text: `${PLUGIN_NAME} - ${TRANSLATIONS[this.plugin.language].Settings}`});
|
||||||
|
|
||||||
|
new Setting(containerEl)
|
||||||
|
.setName(TRANSLATIONS[this.plugin.language].SettingSortAlphabetically)
|
||||||
|
.setDesc(TRANSLATIONS[this.plugin.language].SettingSortAlphabeticallyDescription)
|
||||||
|
.addToggle(toggle => toggle
|
||||||
|
.setValue(this.plugin.settings.sortAlphabetically)
|
||||||
|
.onChange(async (value) => {
|
||||||
|
this.plugin.settings.sortAlphabetically = value;
|
||||||
|
await this.plugin.saveSettings();
|
||||||
|
}));
|
||||||
|
|
||||||
|
new Setting(containerEl)
|
||||||
|
.setName(TRANSLATIONS[this.plugin.language].SettingIncludeNestedFolders)
|
||||||
|
.setDesc(TRANSLATIONS[this.plugin.language].SettingIncludeNestedFoldersDescription)
|
||||||
|
.addToggle(toggle => toggle
|
||||||
|
.setValue(this.plugin.settings.includeNestedFolders)
|
||||||
|
.onChange(async (value) => {
|
||||||
|
this.plugin.settings.includeNestedFolders = value;
|
||||||
|
await this.plugin.saveSettings();
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"id": "advanced-merger",
|
"id": "advanced-merger",
|
||||||
"name": "Advanced Merger",
|
"name": "Advanced Merger",
|
||||||
"version": "1.1.0",
|
"version": "1.2.0",
|
||||||
"minAppVersion": "0.15.0",
|
"minAppVersion": "0.15.0",
|
||||||
"description": "Merge a folder of notes for easier export.",
|
"description": "Merge a folder of notes for easier export.",
|
||||||
"author": "Anto Keinänen",
|
"author": "Anto Keinänen",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue