Esempio n. 1
0
        public override void OnExecute(Ommel loader, Mod mod)
        {
            var param_counter = 0;

            if (Line != null)
            {
                param_counter += 1;
            }
            if (Offset != null)
            {
                param_counter += 1;
            }
            if (param_counter == 0)
            {
                throw new Exception($"Missing location parameter - choose either 'Line' or 'Offset'");
            }
            if (param_counter > 1)
            {
                throw new Exception("Too many parameters given to TextInsert - choose either 'Line' or 'Offset'");
            }

            loader.RegisterModifiedFile(TargetFile);
            var source_path = mod.GetFile(SourceFile);

            StringBuilder s = new StringBuilder();

            string data_to_be_inserted = null;

            using (var source_file = new StreamReader(File.OpenRead(source_path))) {
                data_to_be_inserted = source_file.ReadToEnd();
                if (Trim)
                {
                    data_to_be_inserted = data_to_be_inserted.Trim();
                }
            }


            var string_map = mod.LoadReplacementMap(PlaceholderFile);

            if (string_map == null && Placeholders != null)
            {
                Logger.Warn($"File operation requested to use placeholders, but there is no string map file");
                return;
            }
            else if (string_map != null && Placeholders != null)
            {
                data_to_be_inserted = mod.ReplaceStrings(string_map, Placeholders.ToArray(), mod.Ommeldata.PlaceholderPrefix, mod.Ommeldata.PlaceholderSuffix, data_to_be_inserted);
            }

            if (Offset != null)
            {
                using (var target_file = new StreamReader(File.OpenRead(loader.ExpandTargetPathDefaulted(TargetFile)))) {
                    var target_pre_data = new char[Offset.Value];
                    target_file.Read(target_pre_data, 0, Offset.Value);
                    s.Append(target_pre_data);
                    s.Append(data_to_be_inserted);
                    s.Append(target_file.ReadToEnd());
                }
            }
            else if (Line != null)
            {
                using (var target_file = new StreamReader(File.OpenRead(loader.ExpandTargetPathDefaulted(TargetFile)))) {
                    var line_idx = 1;
                    while (!target_file.EndOfStream)
                    {
                        if (line_idx == Line.Value)
                        {
                            s.Append(data_to_be_inserted);
                        }
                        s.AppendLine(target_file.ReadLine());
                        line_idx += 1;
                    }
                }
            }

            loader.DeleteFile(TargetFile);

            using (var output = new StreamWriter(loader.OpenWriteTarget(TargetFile))) {
                output.Write(loader.ProcessNewlines(s.ToString()));
            }
        }