| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /** |
| * This script is called by generate_devtools_ui_strings.py as part of the build process. It |
| * parses DevTools frontend .js and module.json files, collects localizable strings, checks |
| * if frontend strings are in .grd/.grdp files and reports error if present, and generates |
| * {jsonKey, IDS_KEY} mappings if there is no error. |
| * |
| * Usage: |
| * --root_gen_dir The root directory of the output .h and .cc files |
| * --output_header Absolute path of the output .h file for the id mappings |
| * --output_cc Absolute path of the output .cc file for the id mappings |
| */ |
| |
| const checkLocalizedStrings = require('../localization/utils/check_localized_strings'); |
| const localizationUtils = require('../localization/utils/localization_utils'); |
| |
| const fs = require('fs'); |
| const path = require('path'); |
| const {promisify} = require('util'); |
| const writeFileAsync = promisify(fs.writeFile); |
| |
| class Arguments { |
| constructor(rootGenDir, outputHeaderFilePath, outputCCFilePath) { |
| this.rootGenDir = rootGenDir; |
| this.outputHeaderFilePath = outputHeaderFilePath; |
| this.outputCCFilePath = outputCCFilePath; |
| } |
| } |
| |
| function parseArguments(args) { |
| const rootGenDirIndex = args.indexOf('--root_gen_dir'); |
| const outputHeaderIndex = args.indexOf('--output_header'); |
| const outputCCIndex = args.indexOf('--output_cc'); |
| return new Arguments(args[rootGenDirIndex + 1], args[outputHeaderIndex + 1], args[outputCCIndex + 1]); |
| } |
| |
| async function main() { |
| const args = parseArguments(process.argv); |
| let frontendStrings; |
| try { |
| [frontendStrings, _] = await checkLocalizedStrings.parseLocalizableResourceMaps(); |
| } catch (e) { |
| console.log(e); |
| process.exit(1); |
| } |
| |
| const toAddError = checkLocalizedStrings.getAndReportResourcesToAdd(); |
| const toModifyError = checkLocalizedStrings.getAndReportIDSKeysToModify(); |
| const toRemoveError = checkLocalizedStrings.getAndReportResourcesToRemove(); |
| let error = `${toAddError ? `${toAddError}\n` : ''}${toModifyError ? `${toModifyError}\n` : ''}${ |
| toRemoveError ? `${toRemoveError}\n` : ''}`; |
| if (error !== '') { |
| error += |
| '\nThe errors are potentially fixable with `node third_party/devtools-frontend/src/scripts/check_localizable_resources.js --autofix`' |
| console.log(error); |
| } |
| |
| // Since it's part of the build system, only fail if there are strings to be added to GRD/GRDP files |
| // or if there are wrong IDS_ keys. |
| if (toAddError || toModifyError) |
| process.exit(1); |
| |
| try { |
| await generateDevToolsLocalizedStrings(args, frontendStrings); |
| } catch (e) { |
| console.log('Error generating id map files:'); |
| console.log(e.stack); |
| process.exit(1); |
| } |
| } |
| |
| // Generates {jsonKey, IDS_KEY} mappings according to frontendStrings |
| async function generateDevToolsLocalizedStrings(args, frontendStrings) { |
| const promises = []; |
| const outputAbsoluteHeaderFilePath = path.join(args.rootGenDir, args.outputHeaderFilePath); |
| const outputAbsoluteCCFilePath = path.join(args.rootGenDir, args.outputCCFilePath); |
| const doNotEditStr = |
| `// This file is automatically generated by //third_party/devtools-frontend/src/scripts/build/generate_devtools_ui_strings.js. Do not edit.`; |
| const outputHeaderFileContent = `${doNotEditStr} |
| |
| #ifndef CHROME_BROWSER_UI_WEBUI_DEVTOOLS_UI_STRINGS_H_ |
| #define CHROME_BROWSER_UI_WEBUI_DEVTOOLS_UI_STRINGS_H_ |
| |
| #include "chrome/browser/ui/webui/localized_string.h" |
| |
| namespace devtools { |
| |
| constexpr unsigned int kLocalizedStringsSize = ${frontendStrings.size}; |
| extern const LocalizedString kLocalizedStrings[kLocalizedStringsSize]; |
| |
| } // namespace devtools |
| |
| #endif // CHROME_BROWSER_UI_WEBUI_DEVTOOLS_UI_STRINGS_H_ |
| `; |
| |
| promises.push(writeFileAsync(outputAbsoluteHeaderFilePath, outputHeaderFileContent)); |
| |
| let mappingsStr = ''; |
| frontendStrings.forEach((frontendString, idsKey) => { |
| mappingsStr += ` {"${localizationUtils.sanitizeStringIntoCppFormat(frontendString.string)}", ${idsKey}},\n`; |
| }); |
| |
| const outputCCFileContent = `${doNotEditStr} |
| |
| #include "${args.outputHeaderFilePath}" |
| |
| #include "third_party/devtools-frontend/src/front_end/langpacks/devtools_ui_strings.h" |
| |
| namespace devtools { |
| |
| const LocalizedString kLocalizedStrings[] = { |
| ${mappingsStr}}; |
| |
| } // namespace devtools |
| `; |
| |
| promises.push(writeFileAsync(outputAbsoluteCCFilePath, outputCCFileContent)); |
| return Promise.all(promises); |
| } |
| |
| main(); |