/// <summary> /// Append a script into other script file. /// </summary> /// <param name="subScriptFilePath">Source script file.</param> /// <param name="outFilePath">Target script file.</param> /// <param name="append">Whether appending to target script file.</param> /// <returns>Invalid format script entry strings.</returns> private DataErrorSet AppendScript(string subScriptFilePath, string outFilePath, bool append) { DataErrorSet errorSet = new DataErrorSet(); SortedDictionary<string, ScriptItem> existEntries = new SortedDictionary<string, ScriptItem>(); if (append && File.Exists(outFilePath)) { errorSet = ReadAllData(outFilePath, Language, EngineType, existEntries); } else { Helper.EnsureFolderExistForFile(outFilePath); } SortedDictionary<string, ScriptItem> subEntries = new SortedDictionary<string, ScriptItem>(); DataErrorSet subErrorSet = ReadAllData(subScriptFilePath, Language, EngineType, subEntries); errorSet.Merge(subErrorSet); using (StreamWriter sw = new StreamWriter(outFilePath, append, Encoding.Unicode)) { foreach (string sid in subEntries.Keys) { if (existEntries.ContainsKey(sid)) { DataError error = new DataError(subScriptFilePath, "Entry already exists in script file [" + outFilePath + "]", sid); errorSet.Errors.Add(error); continue; } // hook handling DataError preAppendError = ProcessPronunciation(subEntries[sid]); if (preAppendError != null) { errorSet.Errors.Add(preAppendError); continue; } sw.WriteLine(subEntries[sid].ToString(true, true, true)); } } return errorSet; }
/// <summary> /// Concatenate script files in given file list into an unified sript file and reorder the sentence ID. /// </summary> /// <param name="language">Language of the script to process.</param> /// <param name="fileList">A set of file names to be concatenated.</param> /// <param name="resetSid">A bool to indicate whether re-oreder the sentence ID of all scripts.</param> /// <param name="targetScriptFilePath">The output script file path.</param> /// <returns>Data error set containing error found.</returns> public static DataErrorSet ConcatenateFiles(Language language, IEnumerable<string> fileList, bool resetSid, string targetScriptFilePath) { if (string.IsNullOrEmpty(targetScriptFilePath)) { throw new ArgumentNullException("targetScriptFilePath"); } if (fileList == null) { throw new ArgumentNullException("fileList"); } ScriptFile script = Localor.CreateScriptFile(language); DataErrorSet errorSet = new DataErrorSet(); int count = 0; foreach (string file in fileList) { if (string.IsNullOrEmpty(file)) { continue; } ScriptFile subScript = Localor.CreateScriptFile(language); subScript.Load(file); errorSet.Merge(subScript.ErrorSet); foreach (string sid in subScript.Items.Keys) { ScriptItem item = subScript.Items[sid]; item.Id = resetSid ? Helper.NeutralFormat("{0:D10}", ++count) : sid; if (script.Items.ContainsKey(item.Id)) { errorSet.Errors.Add(new DataError(file, "Sentence already exist", sid)); continue; } script.Items.Add(item.Id, item); } } Helper.EnsureFolderExistForFile(targetScriptFilePath); script.Save(targetScriptFilePath); return errorSet; }
/// <summary> /// Build pronunciation script from file list. /// </summary> /// <param name="scriptFilePaths">Hiragana script file list.</param> /// <param name="outFilePath">Romaji pronunciation script file.</param> /// <returns>Data error set found.</returns> public DataErrorSet BuildScript(string[] scriptFilePaths, string outFilePath) { if (scriptFilePaths == null) { throw new ArgumentNullException("scriptFilePaths"); } DataErrorSet errorSet = new DataErrorSet(); for (int i = 0; i < scriptFilePaths.Length; i++) { string scriptFilePath = scriptFilePaths[i]; if (string.IsNullOrEmpty(scriptFilePath)) { throw new InvalidDataException("scriptFilePath"); } if (!scriptFilePath.EndsWith(ScriptFile.Extension, StringComparison.Ordinal)) { continue; } // all script files should be saved in unicode if (!Helper.IsUnicodeFile(scriptFilePath)) { DataError error = new DataError(scriptFilePath, "script file should be saved in Unicode."); errorSet.Errors.Add(error); continue; } // do appending DataErrorSet subErrorSet = AppendScript(scriptFilePath, outFilePath, (i != 0)); // merge error messages errorSet.Merge(subErrorSet); } return errorSet; }