14fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Copyright 2013 The Chromium Authors. All rights reserved.
24fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Use of this source code is governed by a BSD-style license that can be
34fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// found in the LICENSE file.
44fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
54fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor#include "ui/base/accelerators/menu_label_accelerator_util_linux.h"
64fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
74fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor#include "base/strings/string_util.h"
84fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
94fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregornamespace {
104fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
114fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Common implementation of ConvertAcceleratorsFromWindowsStyle() and
124fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// RemoveWindowsStyleAccelerators().
134fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Replaces all ampersands (as used in our grd files to indicate mnemonics)
144fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// to |target|, except ampersands appearing in pairs which are replaced by
154fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// a single ampersand. Any underscores get replaced with two underscores as
164fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// is needed by GTK.
174fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstd::string ConvertAmpersandsTo(const std::string& label,
184fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor                                const std::string& target) {
194fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  std::string ret;
209db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor  ret.reserve(label.length() * 2);
214fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  for (size_t i = 0; i < label.length(); ++i) {
224fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    if ('_' == label[i]) {
234fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor      ret.push_back('_');
244fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor      ret.push_back('_');
254fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    } else if ('&' == label[i]) {
26770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer      if (i + 1 < label.length() && '&' == label[i + 1]) {
274fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor        ret.push_back('&');
284fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor        ++i;
294fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor      } else {
304fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor        ret.append(target);
314fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor      }
32512ce60311b93b6f9a144fb2cf9fe4225f5d57b2Daniel Dunbar    } else {
33512ce60311b93b6f9a144fb2cf9fe4225f5d57b2Daniel Dunbar      ret.push_back(label[i]);
3442f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman    }
354fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  }
360d59292581dbaa4203451709077de40e0ad72c18Anders Carlsson
371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return ret;
384fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor}
391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
404fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor}  // namespace
414fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
424fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregornamespace ui {
434fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
444fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstd::string ConvertAcceleratorsFromWindowsStyle(const std::string& label) {
454fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  return ConvertAmpersandsTo(label, "_");
464fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor}
474fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
484fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstd::string RemoveWindowsStyleAccelerators(const std::string& label) {
494fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  return ConvertAmpersandsTo(label, std::string());
504fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor}
514fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
524fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Replaces all ampersands in |label| with two ampersands. This effectively
534fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// escapes strings for later processing by ConvertAmpersandsTo(), so that
5457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner// ConvertAmpersandsTo(EscapeWindowsStyleAccelerators(x), *) is |x| with
554fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// underscores doubled, making the string that appears to the user just |x|.
564fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstd::string EscapeWindowsStyleAccelerators(const std::string& label) {
5728ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne  std::string ret;
5859e63570359b8adb9eb257759fe766d7aac1995aDouglas Gregor  base::ReplaceChars(label, "&", "&&", &ret);
598419fa3af97208eb00f0cd6c62354ce4ff986677Douglas Gregor  return ret;
606c9c94053132e5ca0655124b70f1c386a332e71dDouglas Gregor}
6159e63570359b8adb9eb257759fe766d7aac1995aDouglas Gregor
624fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor}  // namespace ui
634fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor