Эффективный алгоритм для сравнения специфики правил CSS
Мне было интересно, какой эффективный алгоритм будет в следующем сценарии:
Учитывая проанализированный набор правил CSS, например.
p.pStyle{margin-bottom:20px;font-family:Arial;}
p{font-family:Verdana;}
p.anotherPStyle{margin-bottom:10px;}
из таблицы стилей CSS, возможно, что несколько наборов правил применяются к данному элементу (скажем,<p class="pStyle anotherPStyle">hello</p>
в моем документе).
Мне нужно определить, какие правила в таблице стилей применяются в первую очередь к данному элементу (так что здесь этоp, pStyle and anotherPStyle
), а затем создайте компаратор, способный сортировать применимые правила по специфике (от наиболее специфичных к наиболее общим). ПРИМЕЧАНИЕ. Я уже разработал алгоритм для применения правил после сортировки, поэтому вам не нужно эффективно решать эту проблему.
Я играю с несколькими идеями, а именно с одной, которая включает определение уровня в DOM-дереве, к которому относится данное правило ... Хотя я не уверен, что это правильный путь?
Как движок браузера делает это эффективно? Я собираюсь воспроизвести его на Java, но мне удобно работать со многими другими языками, поэтому любой код, который вы можете предложить, будет наиболее ценным.
Спасибо