Здравствуйте, мыщъх, Вы писали:
М>Дано: толковый паренек, только что закончивший вуз и неплохо разбирающиеся в ассемблере, плюсах, скриптовых языках и всякой прочей околбасице. энергичный, обучаемый. Но ленивый до ужаса...
М>Задание: написать на JavaScript функцию, которая принимает на грудь HTML, находит Java Script'ы (грубо говоря, все что между script и /script), собирает их в кучу и делает eval(). Постановка задачи исходила от манагера, который до того никогда скрипты не курил, жабу не знал, но за часик с небольшим лазанья по иннету накорябал довольно шустро работающий скрипт (обрабатывающий 90% ситуаций), а так же набросал несколько тестовых примеров для его проверки. Скрипт был послан не в качестве образца для подражания, а скорее как разверзнутое ТЗ, чтобы не писать много слов на бумаге.
М>Исходный магеровский скрипт. Тупой до безобразия:
М>М>function grab_js(html)
М>{
М> // html = unescape(html);
М> var js = ""; var x = 0; var y = 0; var z = 0;
М> for(;;)
М> {
М> x = html.search(/<script/i); if (x == -1) break;
М> y = html.substring(x).search(/>/); if (y == -1) break;
М> z = html.substring(x + y).search(/<\/script *>/i); // might be eol as well
М> if (z == -1) break; // z = len of substring(x+y)
М> // grab js
М> js = js + html.substring(x + y + 1, x + y + z) + ";";
М> // grab next js
М> html = html.substring(x + y + z + 1);
М> }
М> return js;
М>}
М>
Если можно использовать сторонние библиотеки, то вся эта задача в jQuery занимает 30-60 секунд и пара строчек кода. Ниже код для примера.
1) $('script').each(funcion() { eval('"' +$(this).html() + '"'); })
2) var inner = ''
$('script').each(funcion() { inner = inner + $(this).html() + ';'); })
eval(inner)