Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Генератор кода страницы


Автор: 12345c 4.9.2006, 13:20
Практическое продолжение темы, начатой здесь - http://forum.vingrad.ru/index.php?showtopic=108433 ("Сделать парсер-генератор кода страницы ").

Сделан генератор кода страницы на основе шаблонов, работающих по структуре данных. Вариант рабочий, не для образца, потому что мне не нравится ненаглядность исполняемого шаблона, отображённого в тексте программы. Шаблон приходится изображать "вверх ногами" - сначала мелкие детали страницы, потом крупные, а связано с тем, что он исполняемый, в шаблон включены строки исполняемого текста.

Сделать можно не циклом, а рекурсией, но нагляднее не становится.

Задача  скрипта - ужать данные большой-большой структурированной страницы, чтобы удобнее было работать с исходным кодом данных. Хотелось бы в будущем отойти от написания индивидуальных генераторов для страниц, иметь управляемость и расширяемость представленного в нём шаблона.

Не буду приводить код - всё есть на странице http://js2.ru/files/js-man3.htm (55 K, из них кода - 1.5 К).

Самое интересное начинается с заголовка "Клиентские объекты" в коде. Примерно строка - 580. Функция rdCell() обрабатывает подаваемый ей код, но интересен вызов её:

Код
genTbl=function(t){
  var o=d.getElementById(t);var s=o.value;
  if(s.indexOf("\n")<0)s=s.replace(/\r/g,"\n");//for Mac
  a=s.replace(/\r\n/g,"\n").split("\n");
  for(i=0;i<a.length;i++)if(a[i]=='=')a.splice(i,1,'','');
  j=0;
  while(j<a.length){i=-1;
    tabl=a[j].substr(0,5).toLowerCase()=='html:'?a[j].substr(5)
      :'<table class=jsObj@@><tr>'+rdCell(fCell)+'</tr></table>';
    d.write(tabl.replace(/@@/,i==4?'':(i==3?75:(i==2?50:30)))
      .replace(/@br@/,''));j++;
}}
fCell -это строка с кодом функции, которая исполняется нужное число раз, пока не исчерпаются образы ячеек во входном потоке. Так реализован шаблон, который, к сожалению, оказывается не наглядным.

Практические результаты - участок кода, который в HTML занимал около 140К, в кодированном виде занимает около 25 К. Важно, что он сохраняет читабельность. Но далее требуется, чтобы он мог достаточно легко развиваться проектировщиком страницы - не просто добавлять новые элементы списка, которые описаны шаблоном fCell , а изменять структуру их. Поэтому есть желание сделать шаблон наглядным.

Автор: Sardar 5.9.2006, 00:46
1) 12345c - ты шаман smile
2) вёрстка впаяна в скрипт, следовательно HTML only
3) формат подаваемых данных на прямую зависит от скрипта, меняем скрипт, всё может слететь
4) не все шаманы как ты, следовательно нужно учить smile

Отсюда, повтороюсь, я бы делал на XML + XSLT, как и большинство наверное.

Автор: 12345c 6.9.2006, 14:57
Конечно, HTML, на него рассчитано. XML стоит делать до него. Переводить на сервере ХML в такую структуру, генерировать скрипт генерации кода, скомпилировать страницу, если она в созданном виде будет вызываться многократно.

Автор: Sardar 7.9.2006, 00:23
Цитата(12345c @  6.9.2006,  13:57 Найти цитируемый пост)
Переводить на сервере ХML в такую структуру

Посмотри на http://forum.vingrad.ru/index.php?showtopic=55863&view=findpost&p=844056, если у тебя ещё останеться желание генерить из XML страницу с особым форматом и скриптами, то приведи хотя бы пример зачем такие сложности если чистый XML можно отправить клиенту (опера вроде как XSLT уже поддерживает, не знаю точно), а форматирование отложить в кешируемые стили. Плюсы компактности на лицо (тем более если передача gzip'ом), плюсы переносимости тоже, хоть XHTML, хоть XSL-FO, хоть что угодно.

Не отговариваю, просто это первый проект который я даже с 12 раза не врубаюсь как применить, когда есть более лучшие альтернативы.

Автор: 12345c 7.9.2006, 15:27
Хочу, чтобы на локальном компьютере не в архиве страницы занимали тоже меньше места.

А где прочитать про зипование при передаче? Известно, что в модемной связи по V42+ поток зипуется, а до местного провайдера как? И делается ли сжатие по ADSL и локальным сетям?

Через что этот архив смотреть? (localisation_static) 
XSLT - конечно, хорошая и правильная альтернатива, только XML с тегами иметь придётся. В зипе они уничтожаются, но в открытом коде занимают место. В конце этот алгоритм должен перекликаться по содержанию с XSLT-кодом для XML-представления.

Автор: Sardar 8.9.2006, 01:39
Цитата(12345c @  7.9.2006,  14:27 Найти цитируемый пост)
А где прочитать про зипование при передаче?

Гуглить HTTP заголовок accept-encoding, используеться часто gzip, по моему реже deflate (простой zip). Сжатие на уровне HTTP, а не ниже по слоям.

Цитата(12345c @  7.9.2006,  14:27 Найти цитируемый пост)
Хочу, чтобы на локальном компьютере не в архиве страницы занимали тоже меньше места.

Хорошо спроектированный XML занимает сам по себе немного места, также модно XML ложить в архив (gzip), файл действительно почти ничего не весит тогда.

Цитата(12345c @  7.9.2006,  14:27 Найти цитируемый пост)
В конце этот алгоритм должен перекликаться по содержанию с XSLT-кодом для XML-представления. 

Какой алгоритм? В XML документе оставляем <?xml-stylesheet type="text/xsl" href="путь до твоего .xsl"?>, браузер при открытии сам поднимет стили и трансформирует документ по ним в нечто красивое/читабельное. И никаких заморочек smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)