• Структура данных для поиска подходящих CSS-правил

    @m-haritonov
    Если я правильно понял, то эталонный условный алгоритм у Вашей задаче следующий:
    Запрос 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 дереве (условно формируемому для селектора запроса) не будет сестринских элементов (только дочерние).
  • Структура данных для поиска подходящих CSS-правил

    @m-haritonov
    Смотрите здесь: https://code.google.com/p/chromium/codesearch#search/&q=querySelector&sq=package:chromium&type=cs
    но еще раз повторюсь: это не то совсем. Мне для заданного пути нужно найти множество селекторов.

    Тогда зачем Вы искали CSS парсер в Chrome (сами же писали)?!
  • Структура данных для поиска подходящих CSS-правил

    @m-haritonov
    (1ый абзац): Проверять каждое правило для каждого элемента — это неправильно (медленно).

    Чтобы избежать этого существуют индексы (тогда скорость поиска увеличится за счёт дополнительных расходов на оперативную память).

    Я пока что пришел к выводу что мне нужна инверсированная хеш-таблица (или что-то типа) правил, в которой селекторы описаны справа налево.

    И почему Вы решили, что поиск снизу вверх будет быстрее, чем сверху вниз? Вы рассматриваете какие-то частные случае таблиц стилей?
  • Структура данных для поиска подходящих CSS-правил

    @m-haritonov
    Пробовали искать в коде JavaScript функций «document.querySelector» и «document.querySelectorAll»?
  • PHPUnit + Selenium: В рамках одного теста пройти по нескольким сайтам

    @m-haritonov
    Ошибся в коде, вот исправленная версия примера:

    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);
    	}
    }
    
  • PHPUnit + Selenium: В рамках одного теста пройти по нескольким сайтам

    @m-haritonov
    Push_Ok уже ответил, поэтому приведу лишь пример кода с перегрузкой метода:

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


    P.S.: $this->setBrowserUrl(), насколько я помню, в итоге задаёт значение базового URL адреса через HTML тег base, поэтому используя вместо него собственное свойство и перегрузку метода, Вы получите практически полный контроль над данным поведением.
  • А есть ли api у brainstorage?

    @m-haritonov
    Какой Вы нетерпеливый :)
  • Блокировка сайта провайдером Ростелеком или кривизна рук?

    @m-haritonov
    Непосредственно с сервера эти сайты удаётся открыть?
  • Неверная кодировка колонтитулов в mPDF?

    @m-haritonov
    Приведите код, воспроизводящий ошибку.
  • Соединение со старой базой mysql из нового php

    @m-haritonov
    А какая версия MySQL стоит на старом сервере и какая версия PHP стоит на новом сервере?
  • Как реализовать многоуровневый вложенный запуск функций?

    @m-haritonov
    Я так же исправил Вам в предоставленной выше версии makeGroup ошибку. У Вас было:
        try{fun();} catch(e) {
            newgroup.status=e;
        }
        newgroup.status='ok';
    

    В результате создаваемой группе всегда присваивался статус «ok», а код newgroup.status=e; фактически был бесполезен.

    Ещё скажите, для чего у Вас присутствует подобный код:
        var _name;
        this.name = _name;
    

    По умолчанию, неинициализированной переменной _name присваивается значение undefined, поэтому Вы с успехом можете заменить подобные вставки кода на:
        this.name = undefined;
    
  • php, опять про кодировки

    @m-haritonov
    * опечатался в начале предыдущего комментария: не «И имел ввиду», а «Я имел ввиду».
  • php, опять про кодировки

    @m-haritonov
    И имел ввиду, какой адрес отправителя прописан у Вас в php скрипте, которым Вы почту отправляете? Вот в этом коде:
        send_mime_mail(@ trim ($_POST['name']),
            'robot@example.com',
            'Поддержка',
            'test@example.com',
            'UTF-8',  // кодировка, в которой находятся передаваемые строки
            'KOI8-R', // кодировка, в которой будет отправлено письмо
            $subject,
            $body);
    

    В версии кода, которую Вы выложили сюда, на хабр у Вас прописан «robot@example.com» в качестве емаил адреса отправителя. В Вашей версии php скрипта какое значение стоит: «robot@example.com» или «robot@ваш_домен_для_которого_в_dns_прописаны_spf_записи»?
  • php, опять про кодировки

    @m-haritonov
    Значения в заголовках «From» и т.п. Вы для примера заменили на example.com или с такими значениями Вы и отправляете письма? Если я правильно понимаю, то через механизм SPF как раз и проверяются значения заголовков вроде «From», в которых у Вас сейчас стоит левый адрес (т.е. в таком случае выходит, что Вы фактически и пытаетесь отправить письмо от чужого имени).
  • php, опять про кодировки

    @m-haritonov
    Попробуйте поотправлять письма исключительно с текстом (именами отправителя и получателя, темой, сообщением и т.п.) на английском языке (символы которого во всех кодировках имеют одни и те же коды) и без манипуляций с перекодированием текста. Это позволит Вам понять, является ли кодировка причиной попадания Ваших писем в спам.
  • php, опять про кодировки

    @m-haritonov
    Не знаю, здесь я говорил лишь об определённом участке кода. А почему Вы решили, что Hotmail отправляет письма в нежелательные именно из-за несоответствия кодировки самого письма и его тела? Тело пришедшего на hotmail письма как-то некорректно отображалось?
  • Как реализуется GUI на чистом функциональном языке без состояния (например, на Haskell)?

    @m-haritonov Автор вопроса
    leventov, спасибо за разъяснение. Но один момент для меня так и остался непонятным. А именно то, как всё это вписывается в целостную модель работы GUI элемента. Если взять в качестве примера GUI элемента примитивное поле ввода, то для его реализации нам понадобятся (беру по минимуму, предположив, что фокус ввода всегда будет на нашем поле):
    — функция для отрисовки прямоугольника на экране: drawRectangle(x1, y1, x2, y2);
    — функция для отрисовки текста на экране: drawText(text, x, y);
    — функция для сохранения текста (введённого в поле ввода) в оперативную память (для последующего чтения): setFieldValue(text);
    — функция для чтения значения, введённого ранее в поле ввода: getFieldValue().

    Для простоты обойдёмся без взаимодействия с клавиатурой и другими устройствами ввода. Предположим, что наша программа просто должна при запуске задать в поле ввода некое значение (например, задать для поля значение по умолчанию) и затем считать его. Тогда программа будет выглядеть примерно так (я буду использовать псевдоязык, т.к. не достаточно знаком с синтаксисом Haskell):

    // Считаем, что функции drawRectangle, drawText и saveToFile определены в 
    // низкоуровневой библиотеке языка
    
    function setFieldValue(text)
    {
        drawText(text, 5, 5);
    
        // А тут надо как-то динамически (во время исполнения программы)  
        // сохранить значение text в оперативную память. Монады? Но как?
    }
    
    function getFieldValue()
    {
        // Откуда брать сохранённый ранее текст?
    }
    
    drawRectangle(0, 0, 200, 50);
    setFieldValue("aaa");
    saveToFile(getFieldValue());
    


    В данном случае можно, конечно, поступить в чисто функциональном стиле и передать функции setFieldValue вторым аргументом ссылку на функцию saveToFile, которую и вызывать внутри setFieldValue (где ей уже будет доступен параметр text).

    Но меня интересует как поступить в ситуации, когда вызов saveToFile выполняется не следом за setFieldValue, а, например, по событию (фактически, когда выполняется другая ветка кода, запускаемая независимо от вызовов цепочки функций из основной ветки кода) — как тут обойтись без записи значения в глобальную переменную?!
  • Как реализуется GUI на чистом функциональном языке без состояния (например, на Haskell)?

    @m-haritonov Автор вопроса
    О том, что в Haskell отсутствует понятие состояния я прочитал в статье на wikibooks.org. Плюс, на сайте haskell.org написано, что он является чистым функциональным языком, что подразумевает обязательную детерминированность функций (зависимость возвращаемого функцией результата только от входных параметров) и отсутствие у них побочных эффектов. Т.е., как я понял, суть подобных языков заключается в определении последовательности функций (дерева функций), одной из которых затем на вход подаются данные, а на выходе получается результат. И за счёт того, что ни одна из функций не может обратиться к внешней переменной (или сохранить данные внутри себя в статических переменных) и достигается хвалёная детерминированность и отсутствие побочных эффектов.
  • Как реализуется GUI на чистом функциональном языке без состояния (например, на Haskell)?

    @m-haritonov Автор вопроса
    Библиотеки-то есть, но на многих других языках функционал низкоуровневых библиотек можно повторить с использованием средств самого языка (такие библиотеки, возможно, будут менее производительными, но более надёжными за счёт того, что язык более высокоуровневый и соответственно в него встроены средства, снижающие количество возможных сповобов допустить ошибку при написании кода). Вот меня и интересует, насколько чистый функциональный язык самодостаточен в этом плане (т.е. предоставляет ли он возможность для реализации низкоуровневых задач). Как я понял, что бы мне как-то в этом вопросе разобраться и адекватно вести дискуссию, — надо глубоко изучить монады.
  • Как реализуется GUI на чистом функциональном языке без состояния (например, на Haskell)?

    @m-haritonov Автор вопроса
    Не пойму, что это значит? Я имел ввиду, как можно реализовать GUI элемент без ручного манипулирования состоянием (без изменения значения переменной вручную, например, для записи в неё текста, введённого в поле ввода). Какая встроенная в чистый функциональный язык (язык, в котором нет средств для изменения переменных) техника может избавить от необходимости в таком манипулировании? Интересует не просто чтение состояния переменной на функциональном языке (к кому же фактически ведь такая функция для чтения уже не будет чистой, т.к. её результат не будет зависеть только от входных параметров), а весь процесс создания GUI элемента.