Создание первой версии описано здесь.
Вы можете прочитать о последней версии Здесь .
Недавно я перешел с Firefox на Google Chrome из-за его простоты и минимализма.
Однако многих преимуществ расширений Firefox катастрофически не хватало.
Например, мне очень часто требуется Linkification — аддон, преобразующий текстовые URL-адреса в HTML-ссылки, и без него жизнь не сладка.
Как вы знаете, неделю назад вышла первая версия Google Chrome (dev), поддерживающая расширения.
И, несмотря на то, что API еще не доработано и очень глючное, я решил побыстрее собрать расширение, реализующее функционал Linkification. Ниже приводится описание процесса создания расширения и ссылка на результат. Насколько я узнал, расширения в Google Chrome состоят из: 1. Manifest.json — обязательный файл с описанием расширения и ссылками на другие файлы.
2. панели инструментов — HTML-файлы, описывающие кнопки, которые появляются в нижней части Chrome. 3. контент-скрипты — файлы javascript, управляющие содержимым веб-страниц.
4. любые другие файлы, которые вы хотите использовать, например изображения, HTML-страницы для всплывающих окон и т. д. Сначала я имел в виду сделать кнопку и скрипт контента, и чтобы этот скрипт контента управлялся этой кнопкой.
К сожалению, связь между панелями инструментов и скриптами содержимого в настоящее время все еще работает с ошибками.
У меня ничего не получилось, так что будет в следующей версии, когда выйдет нормальное API. Поэтому я не буду касаться этой версии без кнопки и темы связи между тулстрипами и контент-скриптами.
Данная версия расширения состоит из 2-х файлов, это файл манифеста и скрипт содержимого javascript, который при загрузке страницы берет на себя весь текст на ней и заменяет текстовые ссылки на HTML.
Файл манифеста выглядит следующим образом: {
"content_scripts": [
{
"js": [
"linky.js"
],
"matches": [
"",
" http://*/* ",
" https://*/* "
]
}
],
"description": "Extension that converts text urls into real html links",
"name": "Chrome-linker",
"version": "0.1"
}
Помимо неинтересного описания, названия и версии, есть "content_scripts": [
{
"js": [
"linky.js"
],
"matches": [
" file:///* ",
" http://*/* ",
" https://*/* "
]
}
],
Он описывает, какой js-файл необходимо загрузить, а также совпадения адресов.
Я написал 3, файл, http и https, возможно, потребуется добавить.
Кстати, «*» писать нельзя, ругается он.
Второй файл — это javascript, который меняет все текстовые ссылки на настоящие.
Я украл его с userjs.org, и выглядит он так: var urlRegex = /\b(((https?|ftp|irc|file|sЭnews):\/\/|(mailto|sЭnews):)[^\s\"<>\{\}\'\(\)]*)/g;
//^^^Medium version
//var urlRegex = /\b(((https?):\/\/)[^\s\"<>\{\}\'\(\)]*)/g;
//^^^Small version
//Set this to a class name if you want it to use a style from a stylesheet.
var linkClass='';
var preCreatedA=null;
var elms = document.evaluate('http://body//text()[not(ancestor::a)][not(ancestor::script)][not(ancestor::style)]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = 0, elm; elm = elms.snapshotItem(i); i++) {
linkifyNode(elm,document);
}
function linkifyNode(node,mydoc){
var i,tmpData,foundPos,matchedText,middleText,endText,v;
var newLinkElement,linkTextNode,skip=0;
if(node){
if (node.data){
tmpData=node.data;
foundPos=tmpData.search(urlRegex);
if (foundPos>=0){
matchedText=RegExp.$1;
middleText=node.splitText(foundPos);
middleText.deleteData(0,matchedText.length);
if (preCreatedA){
newLinkElement=preCreatedA.cloneNode(false);
} else{
newLinkElement=mydoc.createElement('a');
newLinkElement.setAttribute('target','_blank');
if (linkClass!=''){
newLinkElement.setAttribute('class',linkClass);
}
preCreatedA=newLinkElement.cloneNode(false);
}
newLinkElement.setAttribute('href',matchedText);
linkTextNode=mydoc.createTextNode(matchedText);
newLinkElement.appendChild(linkTextNode);
node.parentNode.insertBefore(newLinkElement,middleText);
v=node.parentNode.style.display;
//Check if we have a block element, and if not, flash it to
//avoid the redraw bug.
if (v!='block'){
node.parentNode.style.display='none';
node.parentNode.style.display=v;
}
skip=1;
}
}
}
return skip;
}
Я удалил оттуда всякие window.body.onload, потому что скрипты контента выполняются после загрузки документа.
Чтобы проверить, как все работает, в настройках ярлыка Chrome нужно добавить --load-extension="C:\Users\Alex\Desktop\chrome-linker" к пути, где последний, естественно, является путем в папку с файлами.
При перезапуске Chrome загрузил расширение и, перейдя в типичный варезный сайт со ссылками Я выделил все ссылки RapidShare. Ура.
Остается только скомпилировать расширение в crx-файл и опубликовать его в открытом доступе.
Здесь Этот процесс описывается очень просто.
Нужно скачать питон 2.6 , скачайте скрипт для сборки отсюда и запустите: C:\Users\Alex\Downloads>chromium_extension.py --indir=c:\Users\Alex\Desktop\chrome-linker --outfile=chrome-linker.crx
[INFO] Generated extension ID: 23C7C890C288943A468C4316563B9E9712A22ED4
[INFO] created extension package chrome-linker.crx
[INFO] chrome-linker.crx contents:
[INFO] linky.js
[INFO] manifest.json
Готово, файл chrome-linker.crx появился в моей папке загрузок.
Скачать его можно с моей домашней страницы: а вот и он! После установки заходим в хром://расширения/ .
Вы должны увидеть что-то вроде этого:
Ура! Теперь все URL-адреса будут ссылками.
UPD 1. ID в манифесте указывать не нужно, он генерируется скриптом сборки, прошу прощения за дезинформацию.
, UPD 2. Скорее всего, связь со скриптами контента у меня глючила из-за собственной капризности.
Расширение Google Subscript работает нормально, используя связь между панелями инструментов и сценариями контента.
Так что скоро сделаю новую версию и опишу ее в новом посте P.S. 1. Когда выйдет API, сделаю новую версию с нормальными интерфейсами, если конечно кто-то захочет. P.S. 2. Напишите в комментариях по существу, напишите об опечатках в личном сообщении и скажите, что я ужасный писатель, как я уже знаю.
Теги: #Google Chrome #расширения #chrome-linker #Google Chrome
-
Почему Поисковый Трафик
19 Oct, 24 -
Windows 7 Разошлют Во Все Школы Бесплатно
19 Oct, 24 -
Крутая Стажировка
19 Oct, 24 -
Любовь - Это Зло
19 Oct, 24 -
Программирование По Наследству
19 Oct, 24