<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF84%3AHardcore_Linux</id>
		<title>LXF84:Hardcore Linux - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF84%3AHardcore_Linux"/>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF84:Hardcore_Linux&amp;action=history"/>
		<updated>2026-05-13T23:37:11Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.11.1</generator>

	<entry>
		<id>http://wiki2.linuxformat.ru/index.php?title=LXF84:Hardcore_Linux&amp;diff=6644&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление</title>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF84:Hardcore_Linux&amp;diff=6644&amp;oldid=prev"/>
				<updated>2009-01-22T06:01:57Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''Hardcore Linux''': Проверь себя на крутых проектах для умников&lt;br /&gt;
&lt;br /&gt;
[[Категория:Учебники]]&lt;br /&gt;
&lt;br /&gt;
=Greasemonkey: Обновим Сеть!=&lt;br /&gt;
&lt;br /&gt;
: Не чесались ли у вас руки улучшить даже самые отличные web-сайты? ''Greasemonkey'' научит сайты работать так, как хочется '''Нику Вейчу''', а то и вам.&lt;br /&gt;
&lt;br /&gt;
Задача этого месяца ерундовая: всего-навсего создать собственный web-браузер, способный заново интерпретировать обветшавшие сайты и заставить их слушаться наших команд.&lt;br /&gt;
&lt;br /&gt;
Думаете, пахать придется серьезно? Ну, мы ж не слабаки! Да и не забывайте: фишка нашей серии в том, что черная работа не для нас, главное, чтоб она была сделана. Так что мы и тут извернемся, как истые хакеры.&lt;br /&gt;
&lt;br /&gt;
''Firefox'' – хороший браузер, более чем хороший. Его нужно лишь чуть-чуть «обработать напильником», например, создать специальное расширение, позволяющее при помощи заготовленного сценария&lt;br /&gt;
корректировать взятый HTML... Но нам не придется делать даже этого, поскольку – спасибо '''Аарону Брудману''' ['''Aaron Broodman'''] – на свете есть ''Greasemonkey''! Итак, первый этап нашего хитрого плана завершен:&lt;br /&gt;
мы превратили задачу по написанию миллионов строк кода в задачу состряпать небольшой сценарий ''JavaScript''. Ура!&lt;br /&gt;
&lt;br /&gt;
Хорошо, но прежде чем приступать к созданию сценария, нужно добыть ''Firefox'' и ''Greasemonkey'' (и то и другое находится на прилагаемом диске, но проще скачать их прямо из Сети, с сайта http://greasemonkey.mozdev.org). Кстати, в дальнейшем вам не повредит некоторое знакомство с JavaScript, так что взгляните на врезку.&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Не знаете JavaScript?&lt;br /&gt;
|Содержание=Не беда: если вы хоть раз использовали какой-нибудь язык сценариев,&lt;br /&gt;
то освоитесь очень быстро. Да и занимаемся мы простейшими вещами – чтением и записью в DOM. Есть много книг и учебников, позволяющих узнать больше, а можно просто взять и разобрать несколько готовых скриптов ''Greasemonkey''.&lt;br /&gt;
* JavaScript: The Definitive Guide David Flanagan (O’Reilly)&lt;br /&gt;
* http://www.htmlgoodies.com/primers/jsp&lt;br /&gt;
* http://developer.mozilla.org/en/docs/DOM&lt;br /&gt;
|Ширина=250px}}&lt;br /&gt;
&lt;br /&gt;
Web-приложение, которое я собираюсь улучшать – менеджер фотографий ''Flickr'', а вы можете выбрать любой другой сайт на ваш вкус. Хотя было бы неплохо, если бы этот сайт хорошо поддерживался&lt;br /&gt;
и имел четкую, понятную иерархическую структуру страниц – например, попытайте счастья с новостным сайтом BBC, с Amazon или с Play. Я выбрал ''Flickr'' потому, что здесь есть простор для добавления новых&lt;br /&gt;
функций, а также потому, что визит на этот сайт – повод оставить парочку глумливых комментариев к чужим фото.&lt;br /&gt;
&lt;br /&gt;
''Flickr'' позволяет пользователям помечать свои фотографии, то есть назначать для них ключевые слова-тэги, по которым затем можно выполнять поиск. Но со страницы каждой конкретной фотографии&lt;br /&gt;
можно искать только по одному ключевому слову за раз. Если вы крупным планом (макро) засняли цветок наперстянки и выбрали ключевые слова «природа макро наперстянка» (“nature macro foxglove”), то найти&lt;br /&gt;
похожие кадры, щелкая на метки по отдельности, будет сложновато. Я решил добавить возможность искать по всем имеющимся ключевым словам одновременно. Это хороший тестовый пример, поскольку нам&lt;br /&gt;
потребуется считывать данные со страницы и записывать их обратно. Начнем с чтения.&lt;br /&gt;
&lt;br /&gt;
==Фокус с Flickr==&lt;br /&gt;
&lt;br /&gt;
Требуется найти на странице ''Flickr'', где помещено наше фото и информацию о ключевых словах. У JavaScript хватает методов обработки DOM (внутренней иерархии HTML-документа), и все, что нужно сделать – это посмотреть, где в дереве документа находится нужная информация и как однозначно отличить ее от прочего. Проще всего использовать для этих целей встроенный в ''Firefox'' браузер DOM.&lt;br /&gt;
Откройте его в '''Tools''' – меню инструментов ''Firefox'' – и пощелкайте по&lt;br /&gt;
нему, чтобы увидеть дерево иерархии. ''Firefox'' любезно покажет мигающую красную рамочку вокруг того элемента, который вы выбрали в '''DOM Inspector'''.&lt;br /&gt;
&lt;br /&gt;
Похоже, что нам повезло. Список ключевых слов на странице фотографии хранятся в элементе '''&amp;lt;nowiki&amp;gt;&amp;lt;div&amp;gt;&amp;lt;/nowiki&amp;gt;''' и помечен как '''thetags'''. Это уникальный идентификатор. Таким образом, мы можем просто перетряхнуть все элементы '''&amp;lt;nowiki&amp;gt;&amp;lt;div&amp;gt;&amp;lt;/nowiki&amp;gt;''' в документе, пока не найдем нужный. Вот кусочек&lt;br /&gt;
JavaScript-кода, который это делает:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=java&amp;gt;&lt;br /&gt;
 var divs, tagsdiv&lt;br /&gt;
 divs = document.getElementsByTagName(‘div’);&lt;br /&gt;
 //Мы сохранили все элементы div как объекты&lt;br /&gt;
 //в массиве под названием ‘divs’&lt;br /&gt;
 for (var i=0; i&amp;lt;divs.length; i++) {&lt;br /&gt;
    if(divs[i].id == ‘thetags’){&lt;br /&gt;
        tagsdiv=divs[i];&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь использован метод, позволяющий создать массив всех эле-&lt;br /&gt;
ментов '''&amp;lt;nowiki&amp;gt;&amp;lt;div&amp;gt;&amp;lt;/nowiki&amp;gt;''', а затем искать в нем тот, что нам требуется ('''thetags''').&lt;br /&gt;
Это не самый эффективный способ, но он годится в качестве примера, и его проще модифицировать для ситуаций, когда требуется найти более одного отмеченного элемента '''[в противном случае можно было бы использовать код ''var tagsdiv=document.getElementById(‘thetags’)'', – прим.ред.]'''. Более быстрый метод мы покажем в следующей части.&lt;br /&gt;
     &lt;br /&gt;
'''&amp;lt;nowiki&amp;gt;&amp;lt;div&amp;gt;&amp;lt;/nowiki&amp;gt;''' вообще-то содержит много всего – заголовок, ссылки на&lt;br /&gt;
иконки, плюс еще по одному '''&amp;lt;nowiki&amp;gt;&amp;lt;div&amp;gt;&amp;lt;/nowiki&amp;gt;''' на каждый отдельный тэг. И снова&lt;br /&gt;
мы можем, перебором в цикле, построить список тэгов. Извлечение&lt;br /&gt;
собственно текста метки достигается выборкой HTML-элемента из&lt;br /&gt;
нужного узла (какого именно – видно по DOM-структуре). А потом&lt;br /&gt;
соберем полученные метки в список, который станет основой запроса, который мы передадим обратно на страницу в следующей фазе. Сосредоточьтесь, привожу этот кусок кода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=java&amp;gt;&lt;br /&gt;
 if (tagsdiv) {&lt;br /&gt;
     tagsdiv = tagsdiv.getElementsByTagName(‘div’);&lt;br /&gt;
     tagslist =’’;&lt;br /&gt;
     for (var i = 0; i&amp;lt; tagsdiv.length; i++){&lt;br /&gt;
        if (i&amp;gt;0) {&lt;br /&gt;
            tagslist = tagslist + ‘+’;&lt;br /&gt;
        }&lt;br /&gt;
        tagslist = tagslist + tagsdiv[i].childNodes[3].innerHTML;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод '''childNodes''' любого из узлов дерева содержит список всех&lt;br /&gt;
дочерних узлов, к которым мы можем обращаться по номерам, чтобы&lt;br /&gt;
найти нужный и запросить для него значение '''innerHTML''', в котором&lt;br /&gt;
содержится HTML-представление этого узла. Оно полезно для прояснения непонятных моментов, но проследите за тем, чтобы запросить его для нужного узла, иначе получите описания совершенно посторонних тэгов.&lt;br /&gt;
&lt;br /&gt;
==Вернем долги==&lt;br /&gt;
&lt;br /&gt;
Итак, мы сумели достать нужную информацию из документа. Ура!&lt;br /&gt;
Настало время поиграть с полученным результатом и записать немножко HTML-текста обратно на страницу. Разработчики JavaScript, видимо, предвидели такую необходимость, и припасли множество встроенных&lt;br /&gt;
функций. Первый вопрос, который нужно решить – это в какое место&lt;br /&gt;
страницы поместить наш текст. Подходящим местом выглядит список&lt;br /&gt;
с информацией о снимке в правой части страницы, ниже списка ключевых слов. Вернувшись в DOM-браузер, мы увидим, что это первый на странице элемент '''ul'''. Так что мы просто создаем новый элемент списка&lt;br /&gt;
и вставляем его в нужное место:&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Скорая помощь&lt;br /&gt;
|Содержание=Если вы не слишком уверены в своих талантах JavaScript-программиста, воспользуйтесь готовым&lt;br /&gt;
сценарием с домашней страницы ''Greasemonkey'', там их уйма. Они, как правило, прекрасно документированы и содержат много ценных находок.&lt;br /&gt;
|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=java&amp;gt;&lt;br /&gt;
 var searchtagLi = document.createElement(“li”);&lt;br /&gt;
 searchtagLi.setAttribute(“class”,”Stats”);&lt;br /&gt;
 searchtagText = ‘Search &amp;lt;a href=”http://www.flickr.com/search/&lt;br /&gt;
 ?w=all&amp;amp;q=’+tagslist+’”style=”text-decoration: none;”&amp;gt;similar tags&amp;lt;/a&amp;gt; on&lt;br /&gt;
 Flickr’;&lt;br /&gt;
 searchtagLi.innerHTML = searchtagText;&lt;br /&gt;
 insertpoint = document.getElementsByTagName(“ul”)[0];&lt;br /&gt;
 insertpoint.appendChild(searchtagLi);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод '''setAttribute''' используется для указания, какого класса должен быть наш новый элемент, чтобы по CSS-стилю не отличаться от своих соседей.&lt;br /&gt;
&lt;br /&gt;
Текст, который мы добавили – всего лишь ссылка на функцию продвинутого поиска ''Flickr'', которой мы, вместо одного ключевого слова, передаем собранный нами список. Легко видеть, что потом использован метод '''innerHTML''' для записи данных в объект. Объект '''insertpoint'''&lt;br /&gt;
указывает на ранее найденный элемент '''ul''', так что остается только&lt;br /&gt;
вызвать метод '''appendChild''' для добавления его в дерево (причем в самый конец списка, что очень правильно).&lt;br /&gt;
&lt;br /&gt;
Вот и все, и этого достаточно. Чтобы загрузить скрипт ''Greasemonkey'', просто активируйте это расширение и укажите браузеру на файл (назвав его как-нибудь вроде '''something.user.js''') – ''Greasemonkey'' обнаружит файл и позволит вам его загрузить. '''LXF'''&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>