示例#1
0
        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);
        }
示例#2
0
        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;
        }