Я создал фреймворк, который генерирует на сервере дерево HTML "DOM" в виде дерева объектов Python, а затем выплевывает его в виде строки для отправки клиенту. Это происходит с помощью рекурсивного обхода дерева в глубину: например, div будет выплевывать открывающий div, выплевывать весь детский html, а затем выплевывать закрывающий "/div".
Это дерево разбито на концептуальные компоненты, как показано ниже:
график http://lhy.mit.edu/media/Flow_Chart.png
Это показывает только первые два уровня иерархии; на реальном сайте есть еще много: например, каждый комментарий в панели комментариев является автономным компонентом, каждая кнопка в строке меню является автономным компонентом. Как видите, различные компоненты не обязательно должны находиться на одной и той же глубине в дереве. То, что составляет «компонент», решено мной.
Мне нужна строка complete html для каждого компонента (все, начиная с корневого узла этого компонента и далее), а также строка частичная HTML для каждого компонента ( HTML этого компонента, за исключением HTML его дочерних элементов). Например, частичный HTML основного раздела будет тегом html, head и двумя тегами div only . С другой стороны, complete html для основного раздела будет представлять собой каждый узел на странице.
Как бы я это сделал? Я мог бы просто найти complete HTML-строку каждого компонента и подкомпонента, пометить границы каждого подкомпонента какой-либо строкой и выполнить Regex-Removals, чтобы найти partal HTML-строка для каждого компонента, но это кажется неуклюжим и неэффективным.
Я мог бы сделать итеративно-углубленную DFS, останавливаясь на границе между компонентом и его подкомпонентами, пока не будет исследован каждый узел в этом компоненте. Затем у меня был бы частичный HTML для каждого компонента, но тогда мне нужно было бы сделать аналогичные хакерские вставки Regex-Inserts, чтобы позже создать complete HTML для каждого компонента.
Я мог бы сделать и то и другое, но это заняло бы два прохода и было бы дорого, хотя, возможно, не так дорого, как приведенная выше гимнастика Regex.
Я мог бы создать очередь приоритетов у Дейкстры, чтобы каждый компонент имел более высокий приоритет, чем его дочерние элементы. Оно будет проходить по дереву в правильном порядке, заканчивая каждый компонент, прежде чем перейти к его дочерним элементам, но я понятия не имею, как получить из него последнюю правильно сформированную строку HTML.
Цель всего этого состоит в том, чтобы сервер мог разумно и полностью автономно определять минимальный набор компонентов на странице клиента, которые необходимо изменить при переходе между двумя произвольными страницами.
Если я создаю новую страницу на моем сайте, мне нужно не более Ноль дополнительных строк кода, чтобы он плавно переходил с любой существующей страницы.
Но сначала мне нужно привести в порядок мои алгоритмы обхода графиков html-spewing. Есть идеи?