/// <summary> /// Determines if the given value represents a valid state of this property. /// </summary> /// <param name="value">The state that should be used.</param> /// <returns>True if the state is valid, otherwise false.</returns> protected override Boolean IsValid(CSSValue value) { var items = (value as CSSValueList ?? new CSSValueList(value)).ToList(); var delays = new CSSValueList(); var directions = new CSSValueList(); var durations = new CSSValueList(); var fillModes = new CSSValueList(); var iterationCounts = new CSSValueList(); var names = new CSSValueList(); var timingFunctions = new CSSValueList(); var playStates = new CSSValueList(); foreach (var list in items) { if (list.Length > 8) { return(false); } if (delays.Length != 0) { delays.Add(CSSValue.Separator); durations.Add(CSSValue.Separator); timingFunctions.Add(CSSValue.Separator); iterationCounts.Add(CSSValue.Separator); directions.Add(CSSValue.Separator); fillModes.Add(CSSValue.Separator); names.Add(CSSValue.Separator); playStates.Add(CSSValue.Separator); } CSSValue delay = null, direction = null, duration = null, fillMode = null, iterationCount = null, name = null, timingFunction = null, playState = null; foreach (var item in list) { if (!_duration.CanStore(item, ref duration) && !_timingFunction.CanStore(item, ref timingFunction) && !_delay.CanStore(item, ref delay) && !_iterationCount.CanStore(item, ref iterationCount) && !_direction.CanStore(item, ref direction) && !_fillMode.CanStore(item, ref fillMode) && !_playState.CanStore(item, ref playState) && !_name.CanStore(item, ref name)) { return(false); } } delays.Add(delay ?? new CSSPrimitiveValue(Time.Zero)); durations.Add(duration ?? new CSSPrimitiveValue(Time.Zero)); timingFunctions.Add(timingFunction ?? new CSSPrimitiveValue(TransitionFunction.Ease)); iterationCounts.Add(iterationCount ?? new CSSPrimitiveValue(Number.One)); directions.Add(direction ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.Normal))); fillModes.Add(fillMode ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.None))); names.Add(name ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.None))); playStates.Add(playState ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.Running))); } return(_name.TrySetValue(names.Reduce()) && _delay.TrySetValue(delays.Reduce()) && _direction.TrySetValue(directions.Reduce()) && _duration.TrySetValue(durations.Reduce()) && _fillMode.TrySetValue(fillModes.Reduce()) && _iterationCount.TrySetValue(iterationCounts.Reduce()) && _timingFunction.TrySetValue(timingFunctions.Reduce()) && _playState.TrySetValue(playStates.Reduce())); }
static CSSValueList Combine(CSSValueList h, CSSValueList v, Int32 index) { var list = new CSSValueList(); list.Add(h[index]); list.Add(v[index]); return(list); }
/// <summary> /// Determines if the given value represents a valid state of this property. /// </summary> /// <param name="value">The state that should be used.</param> /// <returns>True if the state is valid, otherwise false.</returns> protected override Boolean IsValid(CSSValue value) { var list = value as CSSValueList ?? new CSSValueList(value); var line = new CSSValueList(); CSSValue color = null, style = null; if (list.Length > 3) { return(false); } for (int i = 0; i < list.Length; i++) { if (_line.CanTake(list[i])) { line.Add(list[i]); } else if (!_color.CanStore(list[i], ref color) && !_style.CanStore(list[i], ref style)) { return(false); } } return(_line.TrySetValue(line.Reduce()) && _color.TrySetValue(color) && _style.TrySetValue(style)); }
/// <summary> /// Determines if the given value represents a valid state of this property. /// </summary> /// <param name="value">The state that should be used.</param> /// <returns>True if the state is valid, otherwise false.</returns> protected override Boolean IsValid(CSSValue value) { var items = (value as CSSValueList ?? new CSSValueList(value)).ToList(); var delays = new CSSValueList(); var durations = new CSSValueList(); var timingFunctions = new CSSValueList(); var properties = new CSSValueList(); foreach (var list in items) { if (list.Length > 8) { return(false); } if (delays.Length != 0) { delays.Add(CSSValue.Separator); durations.Add(CSSValue.Separator); timingFunctions.Add(CSSValue.Separator); properties.Add(CSSValue.Separator); } CSSValue delay = null, duration = null, timingFunction = null, property = null; foreach (var item in list) { if (!_property.CanStore(item, ref property) && !_duration.CanStore(item, ref duration) && !_timingFunction.CanStore(item, ref timingFunction) && !_delay.CanStore(item, ref delay)) { return(false); } } delays.Add(delay ?? new CSSPrimitiveValue(Time.Zero)); durations.Add(duration ?? new CSSPrimitiveValue(Time.Zero)); timingFunctions.Add(timingFunction ?? new CSSPrimitiveValue(TransitionFunction.Ease)); properties.Add(property ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.All))); } return(_property.TrySetValue(properties.Reduce()) && _delay.TrySetValue(delays.Reduce()) && _duration.TrySetValue(durations.Reduce()) && _timingFunction.TrySetValue(timingFunctions.Reduce())); }
/// <summary> /// Determines if the given value represents a valid state of this property. /// </summary> /// <param name="v">The state that should be used.</param> /// <returns>True if the state is valid, otherwise false.</returns> protected override Boolean IsValid(CSSValue v) { var values = v as CSSValueList ?? new CSSValueList(v); var horizontal = new CSSValueList(); var vertical = new CSSValueList(); var uv = false; if (values.Length > 9) { return(false); } foreach (var value in values) { if (value == CSSValue.Delimiter && uv) { return(false); } else if (value == CSSValue.Delimiter) { uv = true; } else if (!_topLeft.CanTake(value)) { return(false); } else if (uv) { vertical.Add(value); } else { horizontal.Add(value); } } if (!ExpandPeriodic(horizontal)) { return(false); } if (uv) { return(ExpandPeriodic(vertical) && _topLeft.TrySetValue(Combine(horizontal, vertical, 0)) && _topRight.TrySetValue(Combine(horizontal, vertical, 1)) && _bottomRight.TrySetValue(Combine(horizontal, vertical, 2)) && _bottomLeft.TrySetValue(Combine(horizontal, vertical, 3))); } return(_topLeft.TrySetValue(horizontal[0]) && _topRight.TrySetValue(horizontal[1]) && _bottomRight.TrySetValue(horizontal[2]) && _bottomLeft.TrySetValue(horizontal[3])); }
protected static Boolean ExpandPeriodic(CSSValueList list) { if (list.Length == 0 || list.Length > 4) { return(false); } if (list.Length == 1) { list.Add(list[0]); } if (list.Length == 2) { list.Add(list[0]); } if (list.Length == 3) { list.Add(list[1]); } return(true); }
internal static Boolean CheckLastProperty(CSSProperty property, Int32 index, CSSValueList arguments) { if (arguments.Length - index > 1) { var newList = new CSSValueList(); while (index < arguments.Length) { newList.Add(arguments[index++]); } return(property.TrySetValue(newList)); } return(CheckSingleProperty(property, index, arguments)); }
public static List <CSSValueList> ToList(this CSSValueList values) { var list = new List <CSSValueList>(); for (int i = 0; i < values.Length; i++) { var entry = new CSSValueList(); for (int j = i; j < values.Length; j++) { if (values[j] == CSSValue.Separator) { break; } entry.Add(values[j]); i++; } list.Add(entry); } return(list); }
Boolean Evaluate(CSSValueList values) { CSSValue source = null; var slice = new CSSValueList(); var outset = new CSSValueList(); var repeat = new CSSValueList(); var width = new CSSValueList(); for (var i = 0; i < values.Length; i++) { var value = values[i]; if (_source.CanStore(value, ref source)) { continue; } else if (repeat.Length == 0 && _repeat.CanTake(value)) { repeat.Add(value); if (i + 1 < values.Length) { repeat.Add(values[++i]); if (!_repeat.CanTake(repeat)) { repeat.Remove(values[i--]); } } continue; } else if (slice.Length == 0 && _slice.CanTake(value)) { slice.Add(value); while (i + 1 < values.Length) { slice.Add(values[++i]); if (!_slice.CanTake(slice)) { slice.Remove(values[i--]); break; } } continue; } else if (value == CSSValue.Delimiter) { if (++i == values.Length) { return(false); } while (i + 1 < values.Length) { value = values[++i]; if (value == CSSValueList.Delimiter) { if (++i == values.Length) { return(false); } while (i + 1 < values.Length) { outset.Add(values[++i]); if (!_outset.CanTake(outset)) { outset.Remove(values[i--]); break; } } if (outset.Length == 0) { return(false); } break; } width.Add(value); if (!_width.CanTake(width)) { width.Remove(values[i--]); break; } } continue; } return(false); } return(_width.TrySetValue(width.Reduce()) && _source.TrySetValue(source) && _outset.TrySetValue(outset.Reduce()) && _repeat.TrySetValue(repeat.Reduce()) && _slice.TrySetValue(slice.Reduce())); }
/// <summary> /// Determines if the given value represents a valid state of this property. /// </summary> /// <param name="value">The state that should be used.</param> /// <returns>True if the state is valid, otherwise false.</returns> protected override Boolean IsValid(CSSValue value) { var items = (value as CSSValueList ?? new CSSValueList(value)).ToList(); var images = new CSSValueList(); var positions = new CSSValueList(); var sizes = new CSSValueList(); var repeats = new CSSValueList(); var attachments = new CSSValueList(); var origins = new CSSValueList(); var clips = new CSSValueList(); CSSValue color = null; foreach (var list in items) { CSSValue image = null, position = null, size = null, repeat = null, attachment = null, origin = null, clip = null; if (color != null) { return(false); } if (images.Length > 0) { images.Add(CSSValue.Separator); positions.Add(CSSValue.Separator); sizes.Add(CSSValue.Separator); repeats.Add(CSSValue.Separator); attachments.Add(CSSValue.Separator); origins.Add(CSSValue.Separator); clips.Add(CSSValue.Separator); } for (int j = 0; j < list.Length; j++) { var item = list[j]; if (_position.CanStore(item, ref position)) { if (j + 1 == list.Length) { continue; } var pack = new CSSValueList(); pack.Add(position); pack.Add(list[j + 1]); if (_position.CanTake(pack)) { positions.Add(position); position = list[++j]; } if (j + 1 < list.Length && list[j + 1] == CSSValue.Delimiter) { j += 2; if (j < list.Length && _size.CanStore(list[j], ref size)) { if (j + 1 == list.Length) { continue; } pack = new CSSValueList(); pack.Add(size); pack.Add(list[j + 1]); if (_size.CanTake(pack)) { sizes.Add(size); size = list[++j]; } } else { return(false); } } } else if (_repeat.CanStore(item, ref repeat)) { if (j + 1 == list.Length) { continue; } var pack = new CSSValueList(); pack.Add(repeat); pack.Add(list[j + 1]); if (_repeat.CanTake(pack)) { repeats.Add(repeat); repeat = list[++j]; } } else if (!_image.CanStore(item, ref image) && !_attachment.CanStore(item, ref attachment) && !_origin.CanStore(item, ref origin) && !_clip.CanStore(item, ref clip) && !_color.CanStore(item, ref color)) { return(false); } } images.Add(image ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.None))); positions.Add(position ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.Center))); sizes.Add(size ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.Auto))); repeats.Add(repeat ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.Repeat))); attachments.Add(attachment ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.Scroll))); origins.Add(origin ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.BorderBox))); clips.Add(clip ?? new CSSPrimitiveValue(new CssIdentifier(Keywords.BorderBox))); } return(_image.TrySetValue(images.Reduce()) && _position.TrySetValue(positions.Reduce()) && _repeat.TrySetValue(repeats.Reduce()) && _attachment.TrySetValue(attachments.Reduce()) && _origin.TrySetValue(origins.Reduce()) && _size.TrySetValue(sizes.Reduce()) && _clip.TrySetValue(clips) && _color.TrySetValue(color)); }