Esempio n. 1
0
        public IDictionary <string, IEnumerable <IPlacementDeclaration> > Process(string placementDeclaration)
        {
            var placements = new Dictionary <string, IEnumerable <IPlacementDeclaration> >();

            if (string.IsNullOrEmpty(placementDeclaration))
            {
                return(placements);
            }

            placementDeclaration = placementDeclaration.Trim();

            if (!placementDeclaration.StartsWith("<Placement>"))
            {
                placementDeclaration = "<Placement>" + placementDeclaration;
            }
            if (!placementDeclaration.EndsWith("</Placement>"))
            {
                placementDeclaration += "</Placement>";
            }

            var placementFile = new PlacementParser().Parse(placementDeclaration);

            if (placementFile != null)
            {
                // Invert the tree into a list of leaves and the stack
                var entries = DrillDownShapeLocations(placementFile.Nodes, Enumerable.Empty <PlacementMatch>());
                foreach (var entry in entries)
                {
                    var shapeLocation = entry.Item1;
                    var matches       = entry.Item2;

                    string shapeType;
                    string differentiator;
                    GetShapeType(shapeLocation, out shapeType, out differentiator);

                    Func <ShapePlacementContext, bool> predicate = ctx => true;
                    if (differentiator != "")
                    {
                        predicate = ctx => (ctx.Differentiator ?? "") == differentiator;
                    }

                    if (matches.Any())
                    {
                        predicate = matches.SelectMany(match => match.Terms).Aggregate(predicate, BuildPredicate);
                    }

                    var placement = new PlacementInfo();

                    var segments = shapeLocation.Location.Split(';').Select(s => s.Trim());
                    foreach (var segment in segments)
                    {
                        if (!segment.Contains('='))
                        {
                            placement.Location = segment;
                        }
                        else
                        {
                            var index    = segment.IndexOf('=');
                            var property = segment.Substring(0, index).ToLower();
                            var value    = segment.Substring(index + 1);
                            switch (property)
                            {
                            case "shape":
                                placement.ShapeType = value;
                                break;

                            case "alternate":
                                placement.Alternates = new[] { value };
                                break;

                            case "wrapper":
                                placement.Wrappers = new[] { value };
                                break;
                            }
                        }
                    }

                    if (!placements.ContainsKey(shapeType))
                    {
                        placements[shapeType] = Enumerable.Empty <IPlacementDeclaration>();
                    }

                    placements[shapeType] = placements[shapeType].Concat(new[]
                    {
                        new PlacementDeclaration
                        {
                            Predicate = predicate,
                            Placement = placement
                        }
                    });
                }
            }

            return(placements);
        }
        public IDictionary<string, IEnumerable<IPlacementDeclaration>> Process(string placementDeclaration)
        {
            var placements = new Dictionary<string, IEnumerable<IPlacementDeclaration>>();

            if (string.IsNullOrEmpty(placementDeclaration)) return placements;

            placementDeclaration = placementDeclaration.Trim();

            if (!placementDeclaration.StartsWith("<Placement>"))
            {
                placementDeclaration = "<Placement>" + placementDeclaration;
            }
            if (!placementDeclaration.EndsWith("</Placement>"))
            {
                placementDeclaration += "</Placement>";
            }

            var placementFile = new PlacementParser().Parse(placementDeclaration);
            if (placementFile != null)
            {
                // Invert the tree into a list of leaves and the stack
                var entries = DrillDownShapeLocations(placementFile.Nodes, Enumerable.Empty<PlacementMatch>());
                foreach (var entry in entries)
                {
                    var shapeLocation = entry.Item1;
                    var matches = entry.Item2;

                    string shapeType;
                    string differentiator;
                    GetShapeType(shapeLocation, out shapeType, out differentiator);

                    Func<ShapePlacementContext, bool> predicate = ctx => true;
                    if (differentiator != "")
                    {
                        predicate = ctx => (ctx.Differentiator ?? "") == differentiator;
                    }

                    if (matches.Any())
                    {
                        predicate = matches.SelectMany(match => match.Terms).Aggregate(predicate, BuildPredicate);
                    }

                    var placement = new PlacementInfo();

                    var segments = shapeLocation.Location.Split(';').Select(s => s.Trim());
                    foreach (var segment in segments)
                    {
                        if (!segment.Contains('='))
                        {
                            placement.Location = segment;
                        }
                        else
                        {
                            var index = segment.IndexOf('=');
                            var property = segment.Substring(0, index).ToLower();
                            var value = segment.Substring(index + 1);
                            switch (property)
                            {
                                case "shape":
                                    placement.ShapeType = value;
                                    break;
                                case "alternate":
                                    placement.Alternates = new[] { value };
                                    break;
                                case "wrapper":
                                    placement.Wrappers = new[] { value };
                                    break;
                            }
                        }
                    }

                    if (!placements.ContainsKey(shapeType))
                    {
                        placements[shapeType] = Enumerable.Empty<IPlacementDeclaration>();
                    }

                    placements[shapeType] = placements[shapeType].Concat(new[]
                    {
                        new PlacementDeclaration
                        {
                            Predicate = predicate,
                            Placement = placement
                        }
                    });
                }
            }

            return placements;
        }