public static MqDocument Parse(string text) { var rt = new MqDocument(); var tokenizer = new MqTokenizer(text); var header = new[] { "Metasequoia", "Document", "\n", "Format", "Text", "Ver" }; if (!tokenizer.Take(header.Length).Select(_ => _.Text).SequenceEqual(header)) { throw new InvalidOperationException("invalid format"); } rt.Version = float.Parse(tokenizer.MoveNext().EnsureKind(MqTokenizer.DigitTokenKind).Text); if (rt.Version >= 2) { throw new NotSupportedException("specified format version not supported"); } foreach (var i in tokenizer) { if (i.Kind == MqTokenizer.IdentifierTokenKind) { var chunk = MqChunk.Parse(tokenizer); switch (chunk.Name.ToLower()) { case "includexml": rt.IncludeXml = chunk.Arguments.First().Trim('"'); break; case "scene": rt.Scene = MqScene.Parse(chunk); break; case "material": rt.Materials = chunk.Children.Select(MqMaterial.Parse).ToList(); break; case "object": rt.Objects.Add(MqObject.Parse(chunk)); break; case "eof": break; default: rt.CustomChunks.Add(chunk); break; } } } return(rt); }
public static MqDocument Parse(string text) { var rt = new MqDocument(); var tokenizer = new MqTokenizer(text); var header = new[] { "Metasequoia", "Document", "\n", "Format", "Text", "Ver" }; if (!tokenizer.Take(header.Length).Select(_ => _.Text).SequenceEqual(header)) throw new InvalidOperationException("invalid format"); rt.Version = float.Parse(tokenizer.MoveNext().EnsureKind(MqTokenizer.DigitTokenKind).Text); if (rt.Version >= 2) throw new NotSupportedException("specified format version not supported"); foreach (var i in tokenizer) if (i.Kind == MqTokenizer.IdentifierTokenKind) { var chunk = MqChunk.Parse(tokenizer); switch (chunk.Name.ToLower()) { case "includexml": rt.IncludeXml = chunk.Arguments.First().Trim('"'); break; case "scene": rt.Scene = MqScene.Parse(chunk); break; case "material": rt.Materials = chunk.Children.Select(MqMaterial.Parse).ToList(); break; case "object": rt.Objects.Add(MqObject.Parse(chunk)); break; case "eof": break; default: rt.CustomChunks.Add(chunk); break; } } return rt; }