Пример #1
0
        public static PseudoClass FromString(string pseudoClass)
        {
            var group = ParserRegex.Match(pseudoClass);

            if (!group.Success)
            {
                throw new ArgumentException();
            }

            var nameGroup = group.Groups["name"];
            var argsGroup = group.Groups["args"];

            if (!PseudoClasses.Contains(nameGroup.Value))
            {
                throw new ArgumentException($"Pseudo class {nameGroup.Value} does not exist.");
            }

            PseudoClass?pseudoClassSelector = nameGroup.Value switch
            {
                "root" => new RootPseudoClass(),
                "only-child" => new OnlyChildPseudoClass(),
                "first-child" => new FirstChildPseudoClass(),
                "last-child" => new LastChildPseudoClass(),
                _ => null
            };

            if (pseudoClassSelector != null && argsGroup.Success)
            {
                throw new ArgumentException($"Pseudo class {nameGroup.Value} does not support arguments.");
            }
            else if (pseudoClassSelector == null && !argsGroup.Success)
            {
                throw new ArgumentException($"Pseudo class {nameGroup.Value} requires arguments.");
            }
            else if (pseudoClassSelector == null)
            {
                pseudoClassSelector = nameGroup.Value switch
                {
                    "not" => new NotPseudoClass(StyleSelectorParser.Parse(argsGroup.Value)),
                    "nth-child" => new NthChildPseudoClass(argsGroup.Value),
                    _ => throw new InvalidProgramException()
                };
            }

            return(pseudoClassSelector);
        }
    }
}
Пример #2
0
        public static void AddStyle(CompilerState state, string selector, DynamicDictionary style)
        {
            var styleSelector = StyleSelectorParser.Parse(selector);
            var container     = new StyleContainer(styleSelector);

            foreach (var(name, value) in style.GetContents())
            {
                if (value == null)
                {
                    state.Context.Logger.Warning($"Style contains null value for property '{name}'.");
                    continue;
                }

                var propName = StringUtility.ToPascalCase(name);
                if (StyleKeys.TryGetByName(propName, out var styleKey) && state.Context.Converters.TryConvert(value, styleKey.Type, out var propertyValue))
                {
                    styleKey.Set(container, propertyValue);
                }
            }

            state.Document.Styles.Add(container);
        }