| 1 | // Aseprite Code Generator
|
| 2 | // Copyright (c) 2021 Igara Studio S.A.
|
| 3 | // Copyright (c) 2014-2017 David Capello
|
| 4 | //
|
| 5 | // This file is released under the terms of the MIT license.
|
| 6 | // Read LICENSE.txt for more information.
|
| 7 |
|
| 8 | #include "base/file_handle.h"
|
| 9 | #include "base/fs.h"
|
| 10 | #include "base/program_options.h"
|
| 11 | #include "base/string.h"
|
| 12 | #include "gen/check_strings.h"
|
| 13 | #include "gen/check_strings.h"
|
| 14 | #include "gen/pref_types.h"
|
| 15 | #include "gen/strings_class.h"
|
| 16 | #include "gen/theme_class.h"
|
| 17 | #include "gen/ui_class.h"
|
| 18 | #include "tinyxml.h"
|
| 19 |
|
| 20 | #include <iostream>
|
| 21 | #include <memory>
|
| 22 |
|
| 23 | typedef base::ProgramOptions PO;
|
| 24 |
|
| 25 | static void run(int argc, const char* argv[])
|
| 26 | {
|
| 27 | PO po;
|
| 28 | PO::Option& inputOpt = po.add("input" ).requiresValue("<filename>" );
|
| 29 | PO::Option& widgetId = po.add("widgetid" ).requiresValue("<id>" );
|
| 30 | PO::Option& prefH = po.add("pref-h" );
|
| 31 | PO::Option& prefCpp = po.add("pref-cpp" );
|
| 32 | PO::Option& theme = po.add("theme" );
|
| 33 | PO::Option& strings = po.add("strings" );
|
| 34 | PO::Option& commandIds = po.add("command-ids" );
|
| 35 | PO::Option& widgetsDir = po.add("widgets-dir" ).requiresValue("<dir>" );
|
| 36 | PO::Option& stringsDir = po.add("strings-dir" ).requiresValue("<dir>" );
|
| 37 | PO::Option& guiFile = po.add("gui-file" ).requiresValue("<filename>" );
|
| 38 | po.parse(argc, argv);
|
| 39 |
|
| 40 | // Try to load the XML file
|
| 41 | std::unique_ptr<TiXmlDocument> doc;
|
| 42 |
|
| 43 | std::string inputFilename = po.value_of(inputOpt);
|
| 44 | if (!inputFilename.empty() &&
|
| 45 | base::get_file_extension(inputFilename) == "xml" ) {
|
| 46 | base::FileHandle inputFile(base::open_file(inputFilename, "rb" ));
|
| 47 | doc.reset(new TiXmlDocument);
|
| 48 | doc->SetValue(inputFilename.c_str());
|
| 49 | if (!doc->LoadFile(inputFile.get())) {
|
| 50 | std::cerr << doc->Value() << ":"
|
| 51 | << doc->ErrorRow() << ":"
|
| 52 | << doc->ErrorCol() << ": "
|
| 53 | << "error " << doc->ErrorId() << ": "
|
| 54 | << doc->ErrorDesc() << "\n" ;
|
| 55 |
|
| 56 | throw std::runtime_error("invalid input file" );
|
| 57 | }
|
| 58 | }
|
| 59 |
|
| 60 | if (doc) {
|
| 61 | // Generate widget class
|
| 62 | if (po.enabled(widgetId))
|
| 63 | gen_ui_class(doc.get(), inputFilename, po.value_of(widgetId));
|
| 64 | // Generate preference header file
|
| 65 | else if (po.enabled(prefH))
|
| 66 | gen_pref_header(doc.get(), inputFilename);
|
| 67 | // Generate preference c++ file
|
| 68 | else if (po.enabled(prefCpp))
|
| 69 | gen_pref_impl(doc.get(), inputFilename);
|
| 70 | // Generate theme class
|
| 71 | else if (po.enabled(theme))
|
| 72 | gen_theme_class(doc.get(), inputFilename);
|
| 73 | }
|
| 74 | // Generate strings.ini.h file
|
| 75 | else if (po.enabled(strings)) {
|
| 76 | gen_strings_class(inputFilename);
|
| 77 | }
|
| 78 | // Generate command_ids.ini.h file
|
| 79 | else if (po.enabled(commandIds)) {
|
| 80 | gen_command_ids(inputFilename);
|
| 81 | }
|
| 82 | // Check all translation files (en.ini, es.ini, etc.)
|
| 83 | else if (po.enabled(widgetsDir) &&
|
| 84 | po.enabled(stringsDir)) {
|
| 85 | check_strings(po.value_of(widgetsDir),
|
| 86 | po.value_of(stringsDir),
|
| 87 | po.value_of(guiFile));
|
| 88 | }
|
| 89 | }
|
| 90 |
|
| 91 | int main(int argc, const char* argv[])
|
| 92 | {
|
| 93 | try {
|
| 94 | run(argc, argv);
|
| 95 | return 0;
|
| 96 | }
|
| 97 | catch (const std::exception& e) {
|
| 98 | std::cerr << e.what() << "\n" ;
|
| 99 | return 1;
|
| 100 | }
|
| 101 | }
|
| 102 | |