Пример #1
0
 void Init(string[] args)
 {
     Kthura.automap = false;
     if (args.Length == 0)
     {
         Uitleg();
         OriCol();
         Environment.Exit(0);
     }
     InitJCR6.Go();
     ExportBasis.Init();
     Dirry.InitAltDrives(AltDrivePlaforms.Windows); // TODO: I may need to expand this later for Linux and Mac.
     cli_Settings = new FlagParse(args);
     cli_Settings.CrString("target");
     cli_Settings.CrString("project");
     cli_Settings.CrString("map");
     cli_Settings.CrString("xpto");
     if (!cli_Settings.Parse())
     {
         Uitleg();
         Error("Parsing command line input failed!");
     }
     Project = cli_Settings.GetString("project");
     Map     = cli_Settings.GetString("map");
     XPTo    = cli_Settings.GetString("xpto");
     Target  = cli_Settings.GetString("target");
     Assert(File.Exists(GlobalConfigFile), $"I cannot find {GlobalConfigFile}");
     GlobalConfig = GINI.ReadFromFile(GlobalConfigFile);
     Assert(GlobalConfig != null, "Global config could nt be properly loaded");
     Assert(Project, "Hey! I don't have a project!");
     Assert(WorkSpace, "I can't find out what the workspace is. Is Kthura properly configured?");
     Assert(File.Exists(ProjectConfigFile), $"I could not access {ProjectConfigFile}. It appears it doesn't exist!");
     Doing("Reading project", ProjectConfigFile);
     ProjectConfig = GINI.ReadFromFile(ProjectConfigFile);
     Assert(ProjectConfig, "Project could not be properly read.");
     Target = cli_Settings.GetString("target");
     if (Target == "")
     {
         Target = ProjectConfig.C("EXPORT.TARGET");
     }
     Assert(Target, "No target");
     Doing("Exporting to", Target);
     Assert(ExportBasis.HaveDriver(Target), $"Driver to export to {Target} has not been found!");
     XPTo = cli_Settings.GetString("xpto");
     if (XPTo == "")
     {
         XPTo = ProjectConfig.C("EXPORT.XPTO");
     }
     Assert(XPTo, "No export-to folder.");
     Map = cli_Settings.GetString("map");
 }
Пример #2
0
        void SetupProject(string[] args)
        {
            dwriteln("Project setup started");
            FlagParse fp = new FlagParse(args);

            fp.CrString("Target", "");
            fp.CrString("To", "");
            fp.CrString("Project", "");
            if (!fp.Parse(
#if DEBUG
                    true
#endif
                    ))
            {
                Crash("Flag parsing failed!");
            }
            XProject = fp.GetString("Project");
            XTarget  = fp.GetString("Target");
            XTo      = fp.GetString("To");
            if (XProject == "" && XTarget == "" && XTo == "")
            {
                cwrite(ConsoleColor.Cyan, "Usage: ");
                cwrite(ConsoleColor.DarkGreen, $"{qstr.RemSuffix(qstr.StripDir(System.Reflection.Assembly.GetEntryAssembly().Location),".exe")} ");
                cwrite(ConsoleColor.DarkMagenta, "-<flag> <value>\n\n");
                cwrite(ConsoleColor.Red, string.Format("{0,15}", "-Project ")); cwriteln(ConsoleColor.Green, "Define the project");
                cwrite(ConsoleColor.Red, string.Format("{0,15}", "-Target ")); cwriteln(ConsoleColor.Green, "Define the target language");
                cwrite(ConsoleColor.Red, string.Format("{0,15}", "-To ")); cwriteln(ConsoleColor.Green, "Define the folder where the translations should go to");
                Console.WriteLine("");
                cwriteln(ConsoleColor.Yellow, "Supported target languages:");
                foreach (string drv in XPort_Base.Drivers.Keys)
                {
                    cwrite(ConsoleColor.Red, "= ");
                    cwriteln(ConsoleColor.DarkYellow, drv);
                }
                Console.WriteLine("");
                cwriteln(ConsoleColor.White, "Please note that \"To\" and \"Target\" can also be defined in the project file, so you don't have to name them here.\nWhen using them here on the cli even if set in the project file, the value set in the cli will take priority!");
                Halt(0);
            }
            if (XProject == "")
            {
                Crash("No Project!");
            }
            ProjectFile = Dirry.AD($"{MainConfig.C("WorkSpace")}/{XProject}/{XProject}.project.GINI");
            dwriteln($"Reading: {ProjectFile}");
            ProjectConfig = GINI.ReadFromFile(ProjectFile);
            cwrite(ConsoleColor.Yellow, "Reading Project: ");
            cwriteln(ConsoleColor.Cyan, XProject);
            if (ProjectConfig == null)
            {
                Crash($"Reading {ProjectFile} failed!");
            }
            if (XTarget == "")
            {
                XTarget = ProjectConfig.C("XPORT.TARGET");
            }
            if (XTarget == "")
            {
                Crash("And to what language do you want to translate this to? Without the -Target flag, I don't know!");
            }
            if (XTo == "")
            {
                XTo = ProjectConfig.C("XPORT.TO");
            }
            if (XTo == "")
            {
                Crash("And where do you want the translations to be put? Without the -To flag, I don't know!");
            }
            XTarget = XTarget.ToLower();
            if (!XPort_Base.Drivers.ContainsKey(XTarget))
            {
                Crash($"I cannot export to {XTarget}");
            }
        }
Пример #3
0
        public override void Run(FlagParse fp)
        {
            if (fp.Args.Length == 1 || fp.GetBool("h"))
            {
                QCol.Green("Extract files from a JCR file! Available switches are:\n\n");
                QCol.Yellow("-nx             "); QCol.Cyan("No eXternals. This means that any file imported from external JCR files will be ignored\n");
                QCol.Yellow("-ow             "); QCol.Cyan("Overwrite existing files\n");
                QCol.Yellow("-nodir          "); QCol.Cyan("Remove paths from file names\n");
                QCol.Yellow("-nac            "); QCol.Cyan("No auto-creation of new directories if needed\n");
                QCol.Yellow("-output <path>  "); QCol.Cyan("Define output path\n");
                QCol.Magenta("\n\nWhat is important to note is that JCR6 was never set up as a real archiver like ZIP, RAR and 7z.\nIt has therefore features that ZIP, RAR, 7z nor any other archiver has.\n\nIt also lacks features the others have.\n\nExtracting was never a full feature of JCR6, but was rather added for completeness sake.\nExtracting files from it can therefore have some funny results.\n\n");
                return;
            }
            var nx         = fp.GetBool("nx");
            var ow         = fp.GetBool("ow");
            var nodir      = fp.GetBool("nodir");
            var autocreate = fp.GetBool("nac");
            var outdir     = fp.GetString("output");

            if (outdir != "")
            {
                outdir = outdir.Replace("\\", "/");
                if (!qstr.Suffixed(outdir, "/"))
                {
                    outdir += "/";
                }
            }
            QCol.Doing("Reading", fp.Args[1]);
            var jcr = JCR6.Dir(fp.Args[1]);

            if (JCR6.JERROR != "")
            {
                QCol.QuickError($"JCR6 Error: {JCR6.JERROR}");
                return;
            }
            try {
                var skipreason = "";
                var allow      = true;
                var offsets    = new Dictionary <string, List <TJCREntry> >();
                var alias      = aliashanding.Ignore;
                void skip(string reason)
                {
                    if (skipreason != "")
                    {
                        skipreason += "; ";
                    }
                    skipreason += reason;
                    allow       = false;
                }
                var shared = false;
                foreach (TJCREntry Ent in jcr.Entries.Values)
                {
                    var tag = $"{Ent.MainFile}:{Ent.Offset}";
                    if (!offsets.ContainsKey(tag))
                    {
                        offsets[tag] = new List <TJCREntry>();
                    }
                    else
                    {
                        shared = true;
                    }
                    offsets[tag].Add(Ent);
                }
                if (shared)
                {
                    Console.Beep();
                    QCol.Red("\n\nWARNING!\n");
                    QCol.Yellow("This resource has some shared-references or aliases as they are properly called in JCR6.\n");
                    QCol.Yellow("Extracting from this file can therefore create tons of duplicate files, as JCR6 cannot tell which entry is more relevant than others.\n");
                    QCol.Yellow("It's strongly recommended to extract files from this resource unless you are sure about what you are doing and what the consequences are and how to deal with them\n");
                    QCol.Cyan("1 = Continue, but ask about any files that has aliases, what to do with them\n");
                    QCol.Cyan("2 = Continue, but skip all files with aliases\n");
                    QCol.Cyan("3 = Continue, and just let the duplicate files come, I don't fear them!\n");
                    QCol.Cyan("Q = Cancel this operation\n");
                    QCol.Magenta("What do you want to do? "); QCol.Green("");
                    {
                        var loop = true;
                        do
                        {
                            var ch = Console.ReadKey();
                            switch (ch.KeyChar)
                            {
                            case '1': alias = aliashanding.Ask; loop = false; break;

                            case '2': alias = aliashanding.Skip; loop = false; break;

                            case '3': alias = aliashanding.Ignore; loop = false; break;

                            case 'q':
                            case 'Q': return;
                            }
                        } while (loop);
                        Console.WriteLine($" -- {alias}");
                    }
                }
                foreach (TJCREntry Ent in jcr.Entries.Values)
                {
                    allow      = true;
                    skipreason = "";
                    // can we do this?
                    var source = Ent.Entry;
                    var target = Ent.Entry;
                    var tag    = $"{Ent.MainFile}:{Ent.Offset}";
                    if (!JCR6.CompDrivers.ContainsKey(Ent.Storage))
                    {
                        skip($"Unknown compression method ({Ent.Storage})");
                    }
                    if (offsets[tag].Count > 1)
                    {
                        switch (alias)
                        {
                        case aliashanding.Skip: skip($"Offset reference as {offsets[tag].Count} entries, and system has been set to skip those"); break;

                        case aliashanding.Ask: {
                            Console.Beep();
                            QCol.Red($"Entry {Ent.Entry} has been aliased.\n");
                            foreach (TJCREntry aliasentry in offsets[tag])
                            {
                                QCol.Magenta("= "); QCol.Cyan($"{aliasentry.Entry}\n");
                            }
                            QCol.Green("Extract ? <Y/N> ");
                            do
                            {
                                var d = Console.ReadKey().KeyChar;
                                if (d == 'Y' || d == 'y')
                                {
                                    break;
                                }
                                if (d == 'N' || d == 'n')
                                {
                                    skip("User decided not to extract"); break;
                                }
                            } while (true);
                            Console.Write("\r");
                            break;
                        }
                        }
                    }
                    if (Ent.MainFile != fp.Args[1] && nx)
                    {
                        skip("No Externals");
                    }
                    if (nodir)
                    {
                        target = qstr.StripDir(target);
                    }
                    target = $"{outdir}{target}";
                    if (!Directory.Exists(qstr.ExtractDir(target)) && !autocreate)
                    {
                        Console.Beep();
                        QCol.Red($"{target}! ");
                        QCol.Yellow($"Create directory {qstr.ExtractDir(target)} ? <Y/N> ");
                        do
                        {
                            var d = Console.ReadKey().KeyChar;
                            if (d == 'Y' || d == 'y')
                            {
                                break;
                            }
                            if (d == 'N' || d == 'n')
                            {
                                skip("User decided not to extract"); break;
                            }
                        } while (true);
                        Console.Write("\n");
                    }
                    if (File.Exists(target) && (!ow))
                    {
                        Console.Beep();
                        QCol.Red($"{target} exists! ");
                        QCol.Yellow($"Overwrite ? <Y/N> ");
                        do
                        {
                            var d = Console.ReadKey().KeyChar;
                            if (d == 'Y' || d == 'y')
                            {
                                break;
                            }
                            if (d == 'N' || d == 'n')
                            {
                                skip("User decided not to extract"); break;
                            }
                        } while (true);
                        Console.Write("\n");
                    }
                    if (allow)
                    {
                        QCol.Doing("Extracting", target, "\r");
                        Directory.CreateDirectory(qstr.ExtractDir(target));
                        var b = jcr.JCR_B(source);
                        QuickStream.SaveBytes(target, b);
                        QCol.Doing(" Extracted", target);
                    }
                    else
                    {
                        QCol.Doing("   Skipped", target, "\t"); QCol.Red($"{skipreason}\n");
                    }
                }
            } catch (Exception e) {
                QCol.QuickError($".NET Error: {e.Message}");
#if DEBUG
                QCol.Magenta(e.StackTrace);
#endif
            }
        }
Пример #4
0
Файл: F_Add.cs Проект: jcr6/NJCR
 public override void Run(FlagParse fp)
 {
     if (fp.Args.Length == 1 || fp.GetBool("h"))
     {
         QCol.Green("Add files to a JCR file! Available switches are:\n\n");
         QCol.Yellow("-doj             "); QCol.Cyan("Destroy original JCR file, so begin completely fresh, always\n");
         QCol.Yellow("-i               "); QCol.Cyan("Input file(s) or directory/directories. (deprecated)\n");
         QCol.Yellow("-cm <method>     "); QCol.Cyan("Compression method for the files inside the JCR file (default is lzma)\n");
         QCol.Yellow("-fc <method>     "); QCol.Cyan("Compression method for the file table inside the JCR file (default is lzma)\n");
         QCol.Yellow("-jif <file>      "); QCol.Cyan("Read a JCR Instruction File to see how files must be stored and under which conditions\n");
         QCol.Yellow("-author <author> "); QCol.Cyan("Add an author to the files added (jif files ignore this flag)\n");
         QCol.Yellow("-notes <notes>   "); QCol.Cyan("Add notes to the files added (jif files ignore this flag)\n");
         QCol.Yellow("-nomerge         "); QCol.Cyan("When set, files detected as JCR6 compatible files will not be merged, but just be addd as a regular file!\n");
         QCol.Yellow("-puremerge       "); QCol.Cyan("When set, entries being added due to JCR-merging will not be repacked, but be directly copied\n");
         QCol.Yellow("                 "); QCol.Magenta("It goes without saying, but using -nomerge and -puremerge in one run is not a very clever thing to do.");
         //QCol.Yellow("-qu              "); QCol.Cyan("Quick update. (Type \"NJCR quhelp\" for more information)\n");
         QCol.Blue("\n\n\n");
         QCol.Green("JCR6 supports the next compression methods:\n");
         foreach (string name in JCR6.CompDrivers.Keys)
         {
             QCol.Red("\t* "); QCol.Yellow($"{name}\n");
         }
         return;
     }
     quick   = fp.GetBool("qu");
     jcrfile = fp.Args[1];
     toadd   = Files(fp);
     filetablecompression = fp.GetString("fc");
     compressionmethod    = fp.GetString("cm");
     puremerge            = fp.GetBool("puremerge");
     nomerge = fp.GetBool("nomerge");
     if (fp.GetString("i") != "")
     {
         var l = new List <string>(toadd);
         l.Add(fp.GetString("i"));
         toadd = l.ToArray();
     }
     updating = File.Exists(jcrfile) && !fp.GetBool("doj");
     if (toadd.Length == 0)
     {
         Add2List(Directory.GetCurrentDirectory(), "", compressionmethod, fp.GetString("author"), fp.GetString("notes"));
     }
     else
     {
         foreach (string fil in toadd)
         {
             Add2List(fil, qstr.StripDir(fil), compressionmethod, fp.GetString("author"), fp.GetString("notes"));
         }
     }
     if (fp.GetString("jif") != "")
     {
         ParseJIF(fp.GetString("jif"));
     }
     if (updating)
     {
         QCol.Doing("Updating", jcrfile);
     }
     else
     {
         QCol.Doing("Creating", jcrfile);
     }
     QCol.Doing("File Storage", compressionmethod);
     QCol.Doing("Table Storage", filetablecompression);
     QCol.Doing("No merge", $"{nomerge}");
     QCol.Doing("Pure merge", $"{puremerge}");
     QCol.Doing("Files", $"{Jiffy.Count}");
     QCol.Doing("NJCR", MKL.MyExe);
     QCol.Doing("PWD", Directory.GetCurrentDirectory());
     Console.WriteLine("\n\n");
     Go();
 }