Ast.TextElement _GetTextElement(FtlParserStream ps) { var buffer = new StringBuilder(); int ch; while ((ch = ps.Current) != Eof) { if (ch == '{') { return(new Ast.TextElement(buffer.ToString())); } if (ch == '\r' || ch == '\n') { if (!ps.IsPeekNextLineValue()) { return(new Ast.TextElement(buffer.ToString())); } ps.SkipNewLine(); ps.SkipInlineWs(); // Add the new line to the buffer buffer.Append((char)ch); continue; } if (ch == '\\') { ps.Next(); GetEscapeSequence(ps, new int[] { '{', '\\' }, buffer); continue; } buffer.Append((char)ps.Current); ps.Next(); } return(new Ast.TextElement(buffer.ToString())); }
Ast.Pattern _GetPattern(FtlParserStream ps) { var elements = new List <Ast.SyntaxNode>(); ps.SkipInlineWs(); int ch; while ((ch = ps.Current) != Eof) { // The end condition for GetPattern's while loop is a newline // which is not followed by a valid pattern continuation. if (ps.IsPeekNewLine() && !ps.IsPeekNextLineValue()) { break; } if (ch == '{') { var element = GetPlaceable(ps); elements.Add(element); } else { var element = GetTextElement(ps); elements.Add(element); } } // Trim trailing whitespace. if (elements.Count > 0 && elements[elements.Count - 1] is Ast.TextElement te) { te.Value = TrimRight(te.Value); } return(new Ast.Pattern(elements)); }