Refined and completed character mapping settings

This commit is contained in:
Dale de Silva 2023-07-22 18:44:12 +10:00
parent 8821b0e669
commit ebb6948f40
5 changed files with 69 additions and 34 deletions

View file

@ -1,4 +1,5 @@
import { Setting } from "obsidian";
import { applyMappingPreset, checkForPresetMatch } from "src/logic/import-logic";
import { folderPathSanitize } from "src/logic/string-processes";
import GoogleKeepImportPlugin from "src/main";
import { ConfirmationModal } from "src/modals/confirmation-modal/confirmation-modal";
@ -292,7 +293,7 @@ export class TagSettingsGroup {
*/
export class CharMappingGroup {
constructor(containerEl: HTMLElement, plugin: GoogleKeepImportPlugin) {
constructor(containerEl: HTMLElement, plugin: GoogleKeepImportPlugin, onComplete: Function) {
containerEl.createEl('h2', {text: 'Character Mapping'});
containerEl.createEl('p', {text: 'Some characters don\'t work so well in file or folder names on certain operating systems. They will therefore be converted according to the following mapping settings.'});
@ -320,18 +321,18 @@ export class CharMappingGroup {
const invalidMapDropdown = new Setting(containerEl)
// .setClass('gki_setting')
.setName('Preset')
.setDesc('Automatically adjust mapping below to prevent errors on the selected kinds of devices and operating systems.')
.setName('Operating Systems')
.setDesc('You can choose to limit the invalid characters you map to suit the specific operating system you\'d like your filenames to be compatible with. By default it\'s set to make your files compatible with all operating systems (And you should probably leave it like this).')
.addDropdown((dropdown) => {
dropdown.addOption(MappingPresets.all, 'Fix for all');
dropdown.addOption(MappingPresets.apple, "Apple");
dropdown.addOption(MappingPresets.android, "Android");
dropdown.addOption(MappingPresets.windows, "Windows");
dropdown.addOption(MappingPresets.allOrWindows, 'All (Or Windows)');
dropdown.addOption(MappingPresets.appleOrAndroid, "Apple or Android");
dropdown.addOption(MappingPresets.linux, "Linux");
dropdown.setValue(MappingPresets.all);
dropdown.setValue(plugin.settings.invalidCharFilter);
dropdown.onChange(async (value) => {
// plugin.settings.createdDate = value as CreatedDateTypes;
applyMappingPreset(value as MappingPresets, plugin.settings);
plugin.settings.invalidCharFilter = value as MappingPresets;
await plugin.saveSettings();
onComplete();
});
})

View file

@ -1,8 +1,8 @@
import { DataWriteOptions, Notice, Plugin, TAbstractFile, TFile, TFolder, Vault } from "obsidian";
import GoogleKeepImportPlugin from "src/main";
import { DataWriteOptions, Notice, TFile, TFolder, Vault } from "obsidian";
import GoogleKeepImportPlugin, { invalidChars_allOrWindowsPreset, invalidChars_appleOrAndroidPreset, invalidChars_linuxPreset} from "src/main";
import { ImportProgressModal } from "src/modals/import-progress-modal/import-progress-modal";
import { filenameSanitize, getFileExtension } from "./string-processes";
import { CreatedDateTypes, PluginSettings } from "src/types/plugin-settings";
import { CharMap, CreatedDateTypes, MappingPresets, PluginSettings } from "src/types/plugin-settings";
import { KeepJson, objectIsKeepJson } from "src/types/keep-data";
import { IgnoreImportReason, ImportResult, LogStatus as LogStatus } from "src/types/results";
import { StartImportModal } from "src/modals/start-import-modal/start-import-modal";
@ -502,4 +502,51 @@ async function importBinaryFile(vault: Vault, folder: TFolder, file: File) : Pro
}
return Promise.resolve(result);
}
export function applyMappingPreset(presetType: MappingPresets, settings: PluginSettings) {
if(presetType === MappingPresets.appleOrAndroid) {
console.log('apple/android');
settings.invalidChars = JSON.parse( JSON.stringify(invalidChars_appleOrAndroidPreset) );
} else if(presetType === MappingPresets.linux) {
console.log('linux');
settings.invalidChars = JSON.parse( JSON.stringify(invalidChars_linuxPreset) );
} else {
console.log('all/Windows');
settings.invalidChars = JSON.parse( JSON.stringify(invalidChars_allOrWindowsPreset) );
}
}
export function getMatchingPreset(invalidChars: Array<CharMap>): string {
function arraysEqual(arr1: CharMap[], arr2: CharMap[]): boolean {
if (arr1.length !== arr2.length) return false;
for (let i = 0; i < arr1.length; i++) {
if (arr1[i].char !== arr2[i].char || arr1[i].replacement !== arr2[i].replacement) {
return false;
}
}
return true;
}
// Define your presets
const presets: Array<[string, CharMap[]]> = [
[MappingPresets.allOrWindows, invalidChars_allOrWindowsPreset],
[MappingPresets.appleOrAndroid, invalidChars_appleOrAndroidPreset],
[MappingPresets.linux, invalidChars_linuxPreset],
];
// Check for a matching preset
for (const [presetName, presetChars] of presets) {
if (arraysEqual(invalidChars, presetChars)) {
return presetName;
}
}
return MappingPresets.allOrWindows;
}

View file

@ -1,5 +1,5 @@
import { Notice, Plugin, addIcon } from 'obsidian';
import { CreatedDateTypes, PluginSettings } from 'src/types/plugin-settings';
import { CreatedDateTypes, MappingPresets, PluginSettings } from 'src/types/plugin-settings';
import { runImportSequence } from './logic/import-logic';
import { MySettingsTab } from './tabs/settings-tab/settings-tab';
import MastodonIcon from 'src/assets/mastodon';
@ -7,7 +7,7 @@ import MastodonIcon from 'src/assets/mastodon';
///////////////////
///////////////////
export const invalidChars_allPreset = [
export const invalidChars_allOrWindowsPreset = [
{ char: '*', replacement: '+' },
{ char: '"', replacement: "'" },
{ char: '\\', replacement: '-' },
@ -20,7 +20,7 @@ export const invalidChars_allPreset = [
];
export const invalidChars_appleAndroidPreset = [
export const invalidChars_appleOrAndroidPreset = [
{ char: '*', replacement: '+' },
{ char: '\\', replacement: '-' },
{ char: '/', replacement: '-' },
@ -30,19 +30,6 @@ export const invalidChars_appleAndroidPreset = [
];
export const invalidChars_windowsPreset = [
{ char: '*', replacement: '+' },
{ char: '"', replacement: "'" },
{ char: '\\', replacement: '-' },
{ char: '/', replacement: '-' },
{ char: '<', replacement: '(' },
{ char: '>', replacement: ')' },
{ char: ':', replacement: '_' },
{ char: '|', replacement: '_' },
{ char: '?', replacement: '' },
];
export const invalidChars_linuxPreset = [
{ char: '/', replacement: '-' },
];
@ -98,7 +85,8 @@ export const DEFAULT_SETTINGS: PluginSettings = {
},
],
// These characters aren't valid in the filepath or name on different operating systems.
invalidChars: JSON.parse( JSON.stringify(invalidChars_allPreset) ),
invalidChars: JSON.parse( JSON.stringify(invalidChars_allOrWindowsPreset) ),
invalidCharFilter: MappingPresets.allOrWindows,
}

View file

@ -57,7 +57,7 @@ export class EditSettingsModal extends Modal {
new TagSettingsGroup(contentEl, this.plugin);
contentEl.createEl('hr');
new CharMappingGroup(contentEl, this.plugin);
new CharMappingGroup(contentEl, this.plugin, () => this.onOpen());
contentEl.createEl('hr');
const modalActions = new Setting(contentEl);

View file

@ -7,10 +7,8 @@ export enum CreatedDateTypes {
};
export enum MappingPresets {
all = 'all',
windows = 'windows',
apple = 'apple',
android = 'android',
allOrWindows = 'all/windows',
appleOrAndroid = 'apple/android',
linux = 'linux',
};
@ -44,4 +42,5 @@ export interface PluginSettings {
},
problemChars: Array<CharMap>,
invalidChars: Array<CharMap>,
invalidCharFilter: MappingPresets,
}