private BuildResult BuildFile(string file, string target, List <AuthLabel> labelMap) { var result = new BuildResult(target); var builder = new StringBuilder(256); using (var output = File.AppendText(target)) { using (var reader = new StreamReader(file, Encoding.GetEncoding(1251))) { var body = false; var authorsTaken = false; while (!reader.EndOfStream) { var token = GetToken(reader); if (string.IsNullOrEmpty(token)) { continue; } if (token.Trim().ToLower() == TitleTag) { body = true; } #region . check for \end{document} . if (token.Trim().ToLower() == FinalTag) { var sb = new StringBuilder(token); while (token != "{") { token = GetToken(reader); sb.Append(token); } while (token != "}") { token = GetToken(reader); sb.Append(token); if (token.Trim().ToLower() == "document") { body = false; } } if (!body) { break; } output.Write(sb.ToString()); } else if (body) { output.Write(token); } #endregion #region . list authors . if (token.Trim().ToLower() == AuthorTag && !authorsTaken) { while (token != "{") { token = GetToken(reader); output.Write(token); } token = GetToken(reader); output.Write(token); while (token != "}") { if (token.Trim().StartsWith("\\") || token.Trim() == ",") { var author = builder.ToString().Trim(' ', ','); if (!string.IsNullOrWhiteSpace(author)) { var label = $"lbl{++_index}"; builder.Clear(); var al = labelMap.FirstOrDefault(x => x.Author == author); if (al != null) { al.Labels.Add(label); } else { labelMap.Add(new AuthLabel(author, label)); } result.Add(label, author); } token = GetToken(reader); output.Write(token); continue; } if (token == "{") { while (token != "}") { token = GetToken(reader); } token = GetToken(reader); output.Write(token); continue; } builder.Append(token.Replace("\r\n", " ").Replace("\r", " ").Replace("\n", " ") .Replace("\t", " ")); token = GetToken(reader); output.Write(token); } authorsTaken = true; } //Последнего автора if (builder.Length > 0) { var author = builder.ToString().Trim(); if (!string.IsNullOrWhiteSpace(author)) { var label = $"lbl{++_index}"; var al = labelMap.FirstOrDefault(x => x.Author == author); if (al != null) { al.Labels.Add(label); } else { labelMap.Add(new AuthLabel(author, label)); } result.Add(label, author); builder.Clear(); } } #endregion } } output.Flush(); } return(result); }