Add option to normalize dialog access keys
authorKevin Sawicki <kevinsawicki@gmail.com>
Thu, 29 Dec 2016 20:05:58 +0000 (12:05 -0800)
committerKevin Sawicki <kevinsawicki@gmail.com>
Fri, 6 Jan 2017 16:56:24 +0000 (08:56 -0800)
lib/browser/api/dialog.js

index e57eb41b83ce4db2d1f9a609a940c0c5beb9a22a..ae41632e3b31231d56a2198e7822d9c4ea15fe51 100644 (file)
@@ -38,6 +38,29 @@ const parseArgs = function (window, options, callback, ...args) {
   return [window, options, callback]
 }
 
+const normalizeAccessKey = (text) => {
+  if (typeof text !== 'string') return text
+
+  // macOS does not have access keys so remove single ampersands
+  // and replace double ampersands with a single ampersand
+  if (process.platform === 'darwin') {
+    return text.replace(/&(&?)/g, '$1')
+  }
+
+  // Linux uses a single underscore as an access key prefix so escape
+  // existing single underscores with a second underscore, replace double
+  // ampersands with a single ampersand, and replace a single ampersand with
+  // a single underscore
+  if (process.platform === 'linux') {
+    return text.replace(/_/g, '__').replace(/&(.?)/g, (match, after) => {
+      if (after === '&') return after
+      return `_${after}`
+    })
+  }
+
+  return text
+}
+
 const checkAppInitialized = function () {
   if (!app.isReady()) {
     throw new Error('dialog module can only be used after app is ready')
@@ -154,7 +177,7 @@ module.exports = {
       }
     }
 
-    let {buttons, cancelId, defaultId, detail, icon, message, title, type} = options
+    let {buttons, cancelId, defaultId, detail, icon, message, title, type, normalizeAccessKeys} = options
 
     if (type == null) {
       type = 'none'
@@ -171,6 +194,10 @@ module.exports = {
       throw new TypeError('Buttons must be an array')
     }
 
+    if (normalizeAccessKeys) {
+      buttons = buttons.map(normalizeAccessKey)
+    }
+
     if (title == null) {
       title = ''
     } else if (typeof title !== 'string') {