но еще раз повторюсь: это не то совсем. Мне для заданного пути нужно найти множество селекторов.
(1ый абзац): Проверять каждое правило для каждого элемента — это неправильно (медленно).
Я пока что пришел к выводу что мне нужна инверсированная хеш-таблица (или что-то типа) правил, в которой селекторы описаны справа налево.
class AaaTest extends BbbTest
{
protected $urlPrefix = '';
function setUp()
{
$this->setBrowser('firefox');
$this->setBrowserUrl('');
$this->urlPrefix = 'https://www.facebook.com';
}
function testDo()
{
$this->url('/facebook');
$this->urlPrefix = 'http://www.opera.com';
$this->url('/computer');
}
function url($url = null)
{
$args = func_get_args();
$args[0] = $this->urlPrefix . $args[0];
return call_user_func_array(array('parent', 'url'), $args);
}
}
class AaaTest extends BbbTest
{
protected $urlPrefix = '';
function setUp()
{
$this->setBrowser('firefox');
$this->setBrowserUrl('');
$this->urlPrefix = 'https://www.facebook.com';
}
function testDo()
{
$this->url('/facebook');
$this->urlPrefix = 'http://www.opera.com';
$this->url('/computer');
}
function url()
{
return call_user_func_array(array('parent', 'url'), func_get_args());
}
}
try{fun();} catch(e) {
newgroup.status=e;
}
newgroup.status='ok';
newgroup.status=e;
фактически был бесполезен. var _name;
this.name = _name;
this.name = undefined;
send_mime_mail(@ trim ($_POST['name']),
'robot@example.com',
'Поддержка',
'test@example.com',
'UTF-8', // кодировка, в которой находятся передаваемые строки
'KOI8-R', // кодировка, в которой будет отправлено письмо
$subject,
$body);
// Считаем, что функции drawRectangle, drawText и saveToFile определены в
// низкоуровневой библиотеке языка
function setFieldValue(text)
{
drawText(text, 5, 5);
// А тут надо как-то динамически (во время исполнения программы)
// сохранить значение text в оперативную память. Монады? Но как?
}
function getFieldValue()
{
// Откуда брать сохранённый ранее текст?
}
drawRectangle(0, 0, 200, 50);
setFieldValue("aaa");
saveToFile(getFieldValue());
Запрос
cssTable.get_styles( 'html > div#content > h3 > a' )
создаёт HTML код<html><div id="content"><h3><a></a></h3></div></html>
к которому применяется каждый из селекторов таблицы стилей. Те селекторы, которые применились к тегу «a» и считаются искомыми. Их правила берутся для дальнейшего объединения и формирования возвращаемого значения.В таком случае, Ваш алгоритм, видимо, действительно будет эффективнее, чем поиск слева направо, т.к. наличие конечного элемента из селектора запроса (т.е. самого глубокого элемента из условного HTML дерева) в конце искомых селекторов из таблицы стилей требуется всегда.
По идее, реализация будет примерно такая же, как и в Вашей реализации алгоритма с конца. Селектор запроса разбивается на части (части «html» и «body» добавляются в начало селектора запроса всегда). Затем для каждой части слева направо ищутся все селекторы из таблицы стилей, начинающиеся на соответствующую часть (притом, ищутся для каждой части каждый раз во всей таблице стилей, включая повторное сравнения ранее отобранных селекторов, т.к. начало одного и того же селектора из таблицы стилей может соответствовать разным частям селектора запроса).
Отобранные селекторы из таблицы стилей, у которых следующая часть не совпадает со следующей частью селектора запроса — отбрасываются (за исключением селекторов потомков («div div») из таблицы стилей, следующий элемент которых надо применять к каждой из последующих частей селектора запроса, даже если совпадение уже нашлось). Также отбрасываются те из отобранных селекторов, у которых по завершению частей селектора запроса, справа ещё остались части.
Это всё лишь набросок, который может быть и ошибочным. Плюс, всё это усложнится, если добавлять в селектор запроса поддержку селектора потомков («div div») — это будет означать, что у нас будет бесконечное множество HTML деревьев (условно формируемых для селектора запроса).
Сестринские селекторы («div+div», «div~div»), а так же некоторые псевдоклассы (":first-child", ":last-child" и т.п.) учитывать, видимо, не понадобится, т.к. в HTML дереве (условно формируемому для селектора запроса) не будет сестринских элементов (только дочерние).