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); } } }
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); }