CssQuery.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Fizzler;
  6. using ExCSS;
  7. #pragma warning disable
  8. namespace Svg.Css
  9. {
  10. internal static class CssQuery
  11. {
  12. public static IEnumerable<SvgElement> QuerySelectorAll(this SvgElement elem, string selector, SvgElementFactory elementFactory)
  13. {
  14. var generator = new SelectorGenerator<SvgElement>(new SvgElementOps(elementFactory));
  15. Fizzler.Parser.Parse(selector, generator);
  16. return generator.Selector(Enumerable.Repeat(elem, 1));
  17. }
  18. public static int GetSpecificity(this BaseSelector selector)
  19. {
  20. if (selector is SimpleSelector)
  21. {
  22. var simpleCode = selector.ToString().ToLowerInvariant();
  23. if (simpleCode.StartsWith(":not("))
  24. {
  25. simpleCode = simpleCode.Substring(5, simpleCode.Length - 6);
  26. return GetSpecificity(new SimpleSelector(simpleCode));
  27. }
  28. else if (simpleCode.StartsWith("#"))
  29. {
  30. // ID selector
  31. return 1 << 12;
  32. }
  33. else if (simpleCode.StartsWith("::") || simpleCode == ":after" || simpleCode == ":before" ||
  34. simpleCode == ":first-letter" || simpleCode == ":first-line" || simpleCode == ":selection")
  35. {
  36. // pseudo-element
  37. return 1 << 4;
  38. }
  39. else if (simpleCode.StartsWith(".") || simpleCode.StartsWith(":") || simpleCode.StartsWith("["))
  40. {
  41. // class, pseudo-class, attribute
  42. return 1 << 8;
  43. }
  44. else if (selector == SimpleSelector.All)
  45. {
  46. // all selector
  47. return 0;
  48. }
  49. else
  50. {
  51. // element selector
  52. return 1 << 4;
  53. }
  54. }
  55. else
  56. {
  57. var list = selector as IEnumerable<BaseSelector>;
  58. if (list != null)
  59. {
  60. return (from s in list select GetSpecificity(s)).Aggregate((p, c) => p + c);
  61. }
  62. else
  63. {
  64. var complex = selector as IEnumerable<CombinatorSelector>;
  65. if (complex != null)
  66. {
  67. return (from s in complex select GetSpecificity(s.Selector)).Aggregate((p, c) => p + c);
  68. }
  69. else
  70. {
  71. return 0;
  72. }
  73. }
  74. }
  75. }
  76. }
  77. }
  78. #pragma warning restore