private void EscapeBackslashAndQuotes(StringBuilder sb, ReadOnlySpan <char> line) { var bsSplitter = new SpanSplitEnumerator <char>(line, "\\".AsSpan()); bool hadBs = false; foreach (var bsPart in bsSplitter) { if (bsPart.End.Value - bsPart.Start.Value < 0) { continue; } if (hadBs) { sb.Append("\\\\"); } var bsLine = line[bsPart]; if (bsLine.IsEmpty) { continue; } var quotSplitter = new SpanSplitEnumerator <char>(bsLine, "\"".AsSpan()); bool hadQuot = false; foreach (var quotPart in quotSplitter) { if (quotPart.End.Value - quotPart.Start.Value < 0) { continue; } if (hadQuot) { sb.Append("\\\""); } sb.Append(bsLine[quotPart]); hadQuot = true; } hadBs = true; } }
private void BuildMultilineAppend(StringBuilder sb, ReadOnlySpan <char> text) { if (text.IsEmpty) { return; } var splitter = new SpanSplitEnumerator <char>(text, "\r\n".AsSpan()); var hadLast = false; foreach (var range in splitter) { if (range.End.Value - range.Start.Value < 0) { continue; } var line = text[range]; if (line.IsEmpty) { continue; } if (hadLast) { sb.Append("\\n\";"); sb.Append(nl); } sb.Append("__builder += \""); EscapeBackslashAndQuotes(sb, line); hadLast = true; } if (hadLast) { sb.Append("\";"); sb.Append(nl); } }