Архив



injun #576871

03/07/2008

cfabort

Написано 03/07/2008

Начну с CF-тегов, о каждом из них я расскажу в отдельном посте. По сути, это будет переводом официальной документации, но в моём изложении и реальном применении. Поехали.

ColdFusion-тег cfabort используется для прерывания исполнения страницы в момент его появляения. CF вернёт всё (или сделает), что исполнилось до появления этого тега.

Этот тег хорош тем для меня, что я частенько его использую в файлах, описывающих “логику” приложения или же в “модели” MVC – например, если нужно куда-то переправить пользователя, то зачем позволять CF обрабатывать всё нижеследующее после перенаправления, если в любом случае оно исполняться не будет, а вот процессорное время и всё остальное – отнимать будет.

У этого тега есть необязательный параметр – showError, который покажет пользователю тот текст, который ему присвоить. Иногда это удобно.

Смотрите как это делается на примере очень простого кода:

<cfif not isdefined("url.urlprm")>
    <cfabort showerror="Нам нужен обязательный параметр!!!">
</cfif>

То есть, если через URL не передаётся параметра urlprm, то выполняется тег cfabort.

А вот и результат:

cfabort

Вопрос о настройках

Написано 03/07/2008

Чисто теоретический вопрос: где лучше и удобнее всего хранить настройки web-приложения, дабы всегда и во всех случаях иметь доступ к ним:

а) в текстовом файле (типа .ini, .cfg, .txt и etc);
б) в xml-файле;
в) в базе данных;
г) в самом исполняемом файле (.php, .cfm и etc);
д) ваш вариант.

Пожалуйста, если не затруднит, ответье в комментах.

Google’овский FAQ по индексации flash-контента

Написано 03/07/2008

Кстати, Google тоже дал свой FAQ по индексации flash-контента. Я его перевёл и немного сократил ((FAQ от Adobe на тему индексации поисковыми ботами, вы можете прочитать в моём переводе по этой ссылке.)).

***

– Какие flash-файлы Google стал лучше индексировать?

– Мы улучшими индексацию текстового контента в SWF, это включает “гаджеты” такие как кнопки или меню, вебсайты и всё остальное.

– Какой контент Google стал лучше индексировать в flash-файлах?

– Весь текст, который пользователь может видеть при взаимодействии с flash-файлом. Индексируя контент, мы также находим URL’ы, которые используются в файле, и добавляем в индеск ровно так, как мы делаем с обычными URL.

– А что с нетекстуальным контентом, типа изображений?

– В настоящее время, мы можем работать только с тестовым контентом. Изображения мы распознать пока не можем. Также, к слову, мы не сможем сгенерировать якорь для кнопки, “на которой нет текста”. Кроме того, мы не индексируем FLV-файлы, такие как, к примеру, проигрываются на YouTube, потому что эти файлы не содержат никаких текстовых элементов.

– Как Google “видит” контент flash-файла?

– Мы разработали алгоритм, который помогает исследовать flash-файл, кликать по кнопкам, вводить в текстовые поля и делать подобные вещи, который делает обычный пользователь. Наш алгоритм запоминает весь текст, который можно проиндексировать. Мы пока не можем рассказать вам обо всех деталях в подробностях, но мы с уверенностью можем заявить, что эти алгоритмы будут усовершенствованы при помощи Adobe.

– Что я должен делать, чтобы Google проиндексировал тексты в моих flash-файлах?

– Да ничего, собственно. Вам не надо предпринимать ничего особенного или участвовать в каких-то акциях, мы всё автоматически начнём индексацию, но будем делать это в рамках нашей технической возможности. Ждите, и Google всё проиндексирует при последующих посещениях ваших сайтов, но учтите, что малоинформативный контент, типа загрузчиков или копирайты будут проигнорированы.

– Какие технические возможности у Google для индексацию flash-контента?

– Сейчас существует три важных ограничителя, и мы работаем над их устранением:

1. Гуглобот не исполняет некоторый JavaScript-код. Так что, если ваши страницы грузят Flash-файлы через JavaScript, Google не сможет проиндексировать его.

2. Пока мы не можем подгружать файлы из других источников. То есть, если ваш flash-файл подгружает откуда-то HTML-документ или XML или ещё что-то, то Google проиндексирует подгруженный контент, как самостоятельный и не присоединит его к индексу анализируемого flash-файла.

3. Пока что мы можем индексировать flash-контент на большинстве распространённых языков, но у нас существуют сложности с биязыковыми файлами. И пока это не будет исправлено, мы не сможем проиндексировать файл, содержащий еврейский и арабский язык вместе.

Парсим XHTML в AS3

Написано 03/07/2008

Предлагаю вам перевод небольшой заметки Стивена Сакса о том, как парсить XHTML в AS3 при помощи Е4Х ((Е4Х – это ECMAScript для XML. Подробнее тут.)).

Мне показалось, что данный текст будет интересен многим, ну и сам, разумеется, не без интереса с ним ознакомился. По сути, Стивен написал несколько советов, поэтому и относитесь к посту, как к набору советов пользователям flash-фреймуорка Gaia.

***

Gaia имеет небольую SEO-фичу (которая в свете нынешнего глубокого понимания ведующими поисковиками swf, приобретает весьма большой интерес), которая позволяет парсить XHTML-страницу и подгружать это дело во Flash. В AS3 используется E4X. И имеется несколько важных моментов, которые вы должны знать перед парсингом.

Первое – вы должны “выключить” два параметра: ignoreWhitespace и prettyPrinting. Для чего – вы узнаете ниже.

XML.ignoreWhitespace = false;
XML.prettyPrinting = false;

Далее, вы должные “переключить” пространство имён с XML на XHTML. Это одна из наших хитростей, и если вы этого не сделаете, вы не сможете ничего пропарсить.

default xml namespace = new Namespace(http://www.w3.org/1999/xhtml);

Теперь, вы можете загружать HTML в ваш xml-объект. В данном примере event.target.data вытекает из Event.COMPLETE URLLoader’а.

var html:XML = XML(event.target.data);

Теперь переходим к развлечениям. Формально, валидный XHTML – это XML. И E4X в состоянии пропарсить его. В Gaia я попытался поискать на XHTML-странице див с идентификатором “copy”, для того чтобы получить доступ ко всем внутренним тегам <р>. Использование E4Х в данном случае очень простое:

var copyTags:XMLList = html..div.(hasOwnProperty("@id") && @id == "copy")..p;

Код прост для понимания: ищется див внутри html с идентификатором “copy” – для этого используется атрибут hasOwnProperty("@id") и когда он найдет, то возвращает XMLList со всеми найденными тегами <р>.

E4X не заточен на парсинг XHTML, и не понимает значения узлов, имеющих внутри теги, такие как тег параграфа. Ведь внутри <р> XHTML предлагает возможность внедрять теги типа <font>, <strong> и <em>. E4X видит эти теги, как “детей” узла, а не как значения тега <р>. Чтобы уйти от этого, мы сделаем итерацию всех “детей” и конкатенируем их вручную.

К примеру, если ваш тег параграфа выглядит следующим образом:

<p>Это <strong>полужирный</strong> текст.</p>

То, children() вернет всё в виде массива, и выглядеть это будет примерно так:

["Это", "<strong>", "полужирный", "</strong>", " текст."]; 

А вот и код для парсинга и конкотенации:

// берём первый параграф-узел <p>
var copyTag:XML = copyTags[0];
var str:String = "";
var len:int = copyTag.children().length();
for (var i:int = 0; i < len; i++)
{
        // конкатенируем каждое дитё
        str += copyTag.children()[i].toXMLString();
}

К сожалению, E4X имеет плохую привычу – он внедряет пространство имён в каждый тег параграфа, и выглядит это весьма экзотично:

"Это <strong namespace="http://www.w3.org/1999/xhtml">полужирный</strong> текст."

И это сыграет с вами плохую штуку, если вы решите использовать это дело в качестве htmlText для TextField во Flash, но если вы захотите убрать пространство имён, то, к сожалению, воспользоваться removeNamespace() не удастся – просто это не работает в данном случае. Вы должны использовать регулярные выражения, чтобы убрать эту гадость.

str = str.replace(/\s+xmlns(:[^=]+)?=\"[^"]*\"/g, "");

Помните, что в самом начале мы “выключили” два параметра? А дело в том, что каждый раз E4X вставляет возврат каретки (то есть переводит на новую строку) между тегами внутри параграфа <p>, и если вы этого не сделаете в случае с prettyPrinting, то получите следующий результат:

Это
полужирный
текст.

И второй параметр, ignoreWhitespace. Если вы его не переведёте в false, то любой пробел вокруг тега внутри параграфа будет удалён, и у вас получится следующий ненужный результат:

Этополужирныйтекст. 

Так вот, сделав всё правильно, вы, в конечном итоге, получите следующий красивый результат:

Это полужирный текст.

Конечно, всё вышеперечисленное вы можете сделать при помощи класса XMLNode, предлагаемого Adobe для парсинга XML в AS1. Но ведь это было так скучно, не правда ли? 🙂