Explorar el Código

added menu entry to create a rule associated to the tab domain or update the matched one

Gildas hace 7 años
padre
commit
4e76e3a83e

+ 6 - 2
_locales/en/messages.json

@@ -8,8 +8,12 @@
         "description": "Menu entry: 'Save page with SingleFile'"
     },
     "menuSelectProfile": {
-        "message": "Select profile",
-        "description": "Menu entry: 'Select profile'"
+        "message": "Select the default profile",
+        "description": "Menu entry: 'Select the default profile'"
+    },
+    "menuAssociateWithProfile": {
+        "message": "Select the profile of the current auto-settings rule",
+        "description": "Menu entry: 'Select the profile of the current auto-settings rule'"
     },
     "menuSaveSelection": {
         "message": "Save selection",

+ 6 - 2
_locales/fr/messages.json

@@ -8,8 +8,12 @@
         "description": "Menu entry: 'Save page with SingleFile'"
     },
     "menuSelectProfile": {
-        "message": "Sélectionner le profil",
-        "description": "Menu entry: 'Select profile'"
+        "message": "Sélectionner le profil par défaut",
+        "description": "Menu entry: 'Select the default profile'"
+    },
+    "menuAssociateWithProfile": {
+        "message": "Sélectionner le profil de la règle d'auto-configuration courante",
+        "description": "Menu entry: 'Select the profile of the current auto-settings rule'"
     },
     "menuSaveSelection": {
         "message": "Sauver la sélection",

+ 6 - 2
_locales/ja/messages.json

@@ -8,8 +8,12 @@
         "description": "メニュー項目: 'SingleFile でページを保存'"
     },
     "menuSelectProfile": {
-        "message": "プロファイルを選択",
-        "description": "Menu entry: 'Select profile'"
+        "message": "Select the default profile",
+        "description": "Menu entry: 'Select the default profile'"
+    },
+    "menuAssociateWithProfile": {
+        "message": "Select the profile of the current auto-settings rule",
+        "description": "Menu entry: 'Select the profile of the current auto-settings rule'"
     },
     "menuSaveSelection": {
         "message": "選択を保存",

+ 6 - 2
_locales/pl/messages.json

@@ -8,8 +8,12 @@
         "description": "Menu entry: 'Save page with SingleFile'"
     },
     "menuSelectProfile": {
-        "message": "Wybierz profil",
-        "description": "Menu entry: 'Select profile'"
+        "message": "Select the default profile",
+        "description": "Menu entry: 'Select the default profile'"
+    },
+    "menuAssociateWithProfile": {
+        "message": "Select the profile of the current auto-settings rule",
+        "description": "Menu entry: 'Select the profile of the current auto-settings rule'"
     },
     "menuSaveSelection": {
         "message": "Zapisz wybór",

+ 6 - 2
_locales/ru/messages.json

@@ -8,8 +8,12 @@
         "description": "Menu entry: 'Save page with SingleFile'"
     },
     "menuSelectProfile": {
-        "message": "Выберите профиль",
-        "description": "Menu entry: 'Select profile'"
+        "message": "Select the default profile",
+        "description": "Menu entry: 'Select the default profile'"
+    },
+    "menuAssociateWithProfile": {
+        "message": "Select the profile of the current auto-settings rule",
+        "description": "Menu entry: 'Select the profile of the current auto-settings rule'"
     },
     "menuSaveSelection": {
         "message": "Сохранить выделенное",

+ 6 - 2
_locales/zh_CN/messages.json

@@ -8,8 +8,12 @@
         "description": "菜单项: '使用 SingleFile 保存页面'"
     },
     "menuSelectProfile": {
-        "message": "选择配置文件",
-        "description": "Menu entry: 'Select profile'"
+        "message": "Select the default profile",
+        "description": "Menu entry: 'Select the default profile'"
+    },
+    "menuAssociateWithProfile": {
+        "message": "Select the profile of the current auto-settings rule",
+        "description": "Menu entry: 'Select the profile of the current auto-settings rule'"
     },
     "menuSaveSelection": {
         "message": "保存选中部分",

+ 6 - 1
extension/core/bg/config.js

@@ -161,7 +161,7 @@ singlefile.config = (() => {
 			const config = await getConfig();
 			return config.profiles;
 		},
-		async getOptions(profileName, url, autoSave) {
+		async getRule(url) {
 			const config = await getConfig();
 			const regExpRules = config.rules.filter(rule => testRegExpRule(rule));
 			let rule = regExpRules.sort(sortRules).find(rule => url && url.match(new RegExp(rule.url.split(REGEXP_RULE_PREFIX)[1])));
@@ -169,6 +169,11 @@ singlefile.config = (() => {
 				const normalRules = config.rules.filter(rule => !testRegExpRule(rule));
 				rule = normalRules.sort(sortRules).find(rule => url && url.includes(rule.url));
 			}
+			return rule;
+		},
+		async getOptions(profileName, url, autoSave) {
+			const config = await getConfig();
+			const rule = await this.getRule(url);
 			return rule ? config.profiles[rule[autoSave ? "autoSaveProfile" : "profile"]] : config.profiles[profileName || singlefile.config.DEFAULT_PROFILE_NAME];
 		},
 		async updateProfile(profileName, profile) {

+ 65 - 3
extension/ui/bg/ui-menu.js

@@ -18,7 +18,7 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global browser, singlefile */
+/* global browser, singlefile, URL */
 
 singlefile.ui.menu = (() => {
 
@@ -26,6 +26,8 @@ singlefile.ui.menu = (() => {
 	const MENU_ID_SAVE_PAGE = "save-page";
 	const MENU_ID_SELECT_PROFILE = "select-profile";
 	const MENU_ID_SELECT_PROFILE_PREFIX = "select-profile-";
+	const MENU_ID_ASSOCIATE_WITH_PROFILE = "associate-with-profile";
+	const MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX = "associate-with-profile-";
 	const MENU_ID_SAVE_SELECTED = "save-selected";
 	const MENU_ID_SAVE_FRAME = "save-frame";
 	const MENU_ID_SAVE_SELECTED_TABS = "save-selected-tabs";
@@ -37,6 +39,7 @@ singlefile.ui.menu = (() => {
 	const MENU_ID_AUTO_SAVE_UNPINNED = "auto-save-unpinned";
 	const MENU_ID_AUTO_SAVE_ALL = "auto-save-all";
 
+	let profileIndexes = new Map();
 	initialize();
 	browser.tabs.onActivated.addListener(async activeInfo => {
 		const tab = await browser.tabs.get(activeInfo.tabId);
@@ -118,6 +121,24 @@ singlefile.ui.menu = (() => {
 					checked: !tabsData.profileName || tabsData.profileName == singlefile.config.DEFAULT_PROFILE_NAME,
 					parentId: MENU_ID_SELECT_PROFILE
 				});
+				browser.menus.create({
+					id: MENU_ID_ASSOCIATE_WITH_PROFILE,
+					title: browser.i18n.getMessage("menuAssociateWithProfile"),
+					contexts: defaultContexts,
+				});
+				let rule;
+				if (tab && tab.url) {
+					rule = await singlefile.config.getRule(tab.url);
+				}
+				browser.menus.create({
+					id: MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + "default",
+					type: "radio",
+					contexts: defaultContexts,
+					title: browser.i18n.getMessage("profileDefaultSettings"),
+					checked: !rule || rule.profile == singlefile.config.DEFAULT_PROFILE_NAME,
+					parentId: MENU_ID_ASSOCIATE_WITH_PROFILE
+				});
+				profileIndexes = new Map();
 				Object.keys(profiles).forEach((profileName, profileIndex) => {
 					if (profileName != singlefile.config.DEFAULT_PROFILE_NAME) {
 						browser.menus.create({
@@ -125,11 +146,25 @@ singlefile.ui.menu = (() => {
 							type: "radio",
 							contexts: defaultContexts,
 							title: profileName,
-							checked: tabsData.profileName == profileName,
+							checked: options.profileName == profileName,
 							parentId: MENU_ID_SELECT_PROFILE
 						});
+						browser.menus.create({
+							id: MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + profileIndex,
+							type: "radio",
+							contexts: defaultContexts,
+							title: profileName,
+							checked: rule && rule.profile == profileName,
+							parentId: MENU_ID_ASSOCIATE_WITH_PROFILE
+						});
+						profileIndexes.set(profileName, profileIndex);
 					}
 				});
+				browser.menus.create({
+					id: "separator-3",
+					contexts: defaultContexts,
+					type: "separator"
+				});
 			}
 			browser.menus.create({
 				id: MENU_ID_AUTO_SAVE,
@@ -237,6 +272,22 @@ singlefile.ui.menu = (() => {
 					refresh();
 					refreshExternalComponents(tab.id, { autoSave: tabsData.autoSaveAll || tabsData.autoSaveUnpinned || (tabsData[tab.id] && tabsData[tab.id].autoSave) });
 				}
+				if (event.menuItemId.startsWith(MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX)) {
+					const [profiles, rule] = await Promise.all([singlefile.config.getProfiles(), singlefile.config.getRule(tab.url)]);
+					const profileId = event.menuItemId.split(MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX)[1];
+					let profileName;
+					if (profileId == "default") {
+						profileName = singlefile.config.DEFAULT_PROFILE_NAME;
+					} else {
+						const profileIndex = Number(profileId);
+						profileName = Object.keys(profiles)[profileIndex];
+					}
+					if (rule) {
+						await singlefile.config.updateRule(rule.url, rule.url, profileName, profileName);
+					} else {
+						await singlefile.config.addRule(new URL(tab.url).hostname, profileName, profileName);
+					}
+				}
 			});
 			const tabs = await browser.tabs.query({});
 			tabs.forEach(tab => refreshTab(tab));
@@ -249,14 +300,25 @@ singlefile.ui.menu = (() => {
 	}
 
 	async function refreshTab(tab) {
-		const tabsData = await singlefile.tabsData.get();
 		if (BROWSER_MENUS_API_SUPPORTED) {
+			const tabsData = await singlefile.tabsData.get();
 			try {
 				const disabled = Boolean(!tabsData[tab.id] || !tabsData[tab.id].autoSave);
 				await browser.menus.update(MENU_ID_AUTO_SAVE_DISABLED, { checked: disabled });
 				await browser.menus.update(MENU_ID_AUTO_SAVE_TAB, { checked: !disabled });
 				await browser.menus.update(MENU_ID_AUTO_SAVE_UNPINNED, { checked: Boolean(tabsData.autoSaveUnpinned) });
 				await browser.menus.update(MENU_ID_AUTO_SAVE_ALL, { checked: Boolean(tabsData.autoSaveAll) });
+				if (tab && tab.url) {
+					let selectedEntryId = MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + "default";
+					const rule = await singlefile.config.getRule(tab.url);
+					if (rule) {
+						const profileIndex = profileIndexes.get(rule.profile);
+						if (profileIndex) {
+							selectedEntryId = MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + profileIndex;
+						}
+					}
+					await browser.menus.update(selectedEntryId, { checked: true });
+				}
 			} catch (error) {
 				/* ignored */
 			}