Друзья, здравствуйте!

Быть может кому попадался на глаза аддон (или может быть кто-то умеет настраивать iMacros) под существующую задачу.
Итак, задача:
Имеется открытая в ff web-страница.
Требуется: отрыть все ссылки, которые имеются на странице, в новых табах. Т.е. каждая ссылка открывается в новом табе.


Пример кода станицы:

скрытый текст

Выделить код

Код:

...
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
<p><a href="http://forum.mozilla-russia.org/">Форум Mozilla Россия</a></p>
...


Сбил пятки в поисках решения =(:whiteflag:
Пожалуйста, помогите..:beer:

Custom Buttons + вот такой код:

Выделить код

Код:

var links = content.document.getElementsByTagName("a");
var hrefs = {};
for(var i = 0; i < links.length; i++)
  hrefs[links[i].href] = 1;
var br = getBrowser();
for(var h in hrefs)
  br.addTab(h);

Добавлено Wed Mar 26 00:25:15 2008 :
Или Linky (тут, вроде, только на английском)

Infocatcher пишет

Custom Buttons + вот такой код:

Выделить код

Код:

var links = content.document.getElementsByTagName("a");
var hrefs = {};
for(var i = 0; i < links.length; i++)
  hrefs[links[i].href] = 1;
var br = getBrowser();
for(var h in hrefs)
  br.addTab(h);

Добавлено Wed Mar 26 00:25:15 2008 :
Или Linky (тут, вроде, только на английском)

Дай Вам Бог здоровья! Большое спасибо!:rock:

объясните, плиз, для чего это нужно? все необходимые ссылки на странице я открываю нажатием на колесо мыши, разве это не то же самое? заинтересовало...

никто не отвечает :( а у меня еще вопрос по Linky - не открываются изображения при нажатии кнопки "открыть все изображения" :(

никто не отвечает :(

да там свои заморочки :)

не открываются изображения при нажатии кнопки "открыть все изображения"

eLika попробуйте что то из этого:
Thumbs
AutoSlideshow
firefusk
Web Slide Show 1.2.

eLika пишет

объясните, плиз, для чего это нужно? все необходимые ссылки на странице я открываю нажатием на колесо мыши, разве это не то же самое? заинтересовало...

Правильно, я тоже колесом. Но у всех свои задвиги:sick:, и некоторые патологически не любят нажимать на колесо:usch:. Вот и начинают искать всякие обходы.

Vladimir_S, спасибо, теперь могу четко оценить необходимость в такой фиче ;)

Z&N, спасибо за ссылки - проанализировала, хотелось бы несколько иного - предложенное Вами оформляет картинки в виде слайдшоу, а мне надо вместо полной прогрузки картинок скопировать их линки да загрузить менеджером закачек. С Linky сражаться устала, есть более простой вариант?

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

eLika а ну тогда например Orbit Downloader  делает это прекрасно :)
e8031044c6ddt.jpg
2886d2fc9e6ft.jpg

Infocatcher пишет

Custom Buttons + вот такой код:

Выделить код

Код:

var links = content.document.getElementsByTagName("a");
var hrefs = {};
for(var i = 0; i < links.length; i++)
  hrefs[links[i].href] = 1;
var br = getBrowser();
for(var h in hrefs)
  br.addTab(h);

Добавлено Wed Mar 26 00:25:15 2008 :
Или Linky (тут, вроде, только на английском)

Подскажи пожалуйста, как научить этот скрипт открывать не все ссылки, а ссылки по заранее заданому шаблону

vanchelo пишет

Подскажи пожалуйста, как научить этот скрипт открывать не все ссылки, а ссылки по заранее заданому шаблону

Как-то так:

скрытый текст

Выделить код

Код:

(function() {
var mask = {};
var maskForLinks = {};
var cnf = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
    .getService(Components.interfaces.nsIPromptService)
    .prompt(
        window,
        "Открыть все ссылки со страницы",
        "Только ссылки, содержащие (используйте /regexp/ для поиска с помощью регулярных выражений):", mask,
        "Фильтр по ссылке", maskForLinks
    );
if(!cnf)
    return;
mask = mask.value;
var allLinks = !mask;
maskForLinks = maskForLinks.value;
var isRegExp = false;
if(/^\/(.+)\/([img]{0,3})$/.test(mask)) {
    try {
        mask = new RegExp(RegExp.$1, RegExp.$2);
    }
    catch(e) {
        alert("Некорректное регулярное выражение:\n\n" + e);
        return;
    }
    isRegExp = true;
}
function check(val) {
    return isRegExp ? mask.test(val) : val.toLowerCase().indexOf(mask) > -1;
}

var links = content.document.getElementsByTagName("a");
var hrefs = {};
var lnk, h, txt;
for(var i = 0, len = links.length; i < len; i++) {
    lnk = links[i];
    h = lnk.href;
    txt = lnk.textContent;
    if(allLinks || check(maskForLinks ? h : txt))
        hrefs[h] = 1;
}
var br = getBrowser();
// Open a new tab as a child of the current tab (Tree Style Tab)
if("TreeStyleTabService" in window)
    TreeStyleTabService.readyToOpenChildTab(br.selectedTab, true);
for(var h in hrefs)
    br.addTab(h);
if("TreeStyleTabService" in window)
    TreeStyleTabService.stopToOpenChildTab(br.selectedTab);
})();


Если шаблон должен задаваться один раз (а не при каждом вызове), нужны подробности.

Огромнейшее спасибо.
Подскажи еще, как правильно задать маску, а то у меня выходит не совсем правильно, открываются и те ссылки которые не должны открываться.
И как задать маску один раз в скрипте, а не при каждом вызове?

А вообще скрипт СУПЕР. Очень нужный

Еще раз спасибо

vanchelo пишет

Подскажи еще, как правильно задать маску, а то у меня выходит не совсем правильно, открываются и те ссылки которые не должны открываться.

http://www.google.ru/
Простые фильтры:

  • «кар» => Картинки + Карты
  • «maps» + галочка «Фильтр по ссылке» => http://maps.google.ru/maps?hl=ru&tab=wl

Регулярные выражения (более актуально для Firefox, но на английском):

  • «/картинки|новости/i» => Картинки + Новости (флаг i обозначает нечувствительность к регистру)
  • «/images|maps/» + галочка «Фильтр по ссылке» => http://images.google.ru/imghp?hl=ru&tab=wi + http://maps.google.ru/maps?hl=ru&tab=wl
vanchelo пишет

И как задать маску один раз в скрипте, а не при каждом вызове?

скрытый текст

Выделить код

Код:

(function() {
var mask = "..."; // простой фильтр
// или регулярное выражение:
// var mask = /.../;
var maskForLinks = false; // фильтровать по "названию" ссылки

var isRegExp = typeof mask != "string";
var allLinks = !mask;
function check(val) {
    return isRegExp ? mask.test(val) : val.toLowerCase().indexOf(mask) > -1;
}

var links = content.document.getElementsByTagName("a");
var hrefs = {};
var lnk, h, txt;
for(var i = 0, len = links.length; i < len; i++) {
    lnk = links[i];
    h = lnk.href;
    txt = lnk.textContent;
    if(allLinks || check(maskForLinks ? h : txt))
        hrefs[h] = 1;
}
var br = getBrowser();
// Open a new tab as a child of the current tab (Tree Style Tab)
if("TreeStyleTabService" in window)
    TreeStyleTabService.readyToOpenChildTab(br.selectedTab, true);
for(var h in hrefs)
    br.addTab(h);
if("TreeStyleTabService" in window)
    TreeStyleTabService.stopToOpenChildTab(br.selectedTab);
})();

Infocatcher
Безмерно Благодарен :)

Еще есть вопрос

Возможно ли чтобы вместо открытия в новых вкладках ссылки копировались в буфер обмена???

vanchelo пишет

Возможно ли чтобы вместо открытия в новых вкладках ссылки копировались в буфер обмена???

Выделить код

Код:

var br = getBrowser();
// Open a new tab as a child of the current tab (Tree Style Tab)
if("TreeStyleTabService" in window)
    TreeStyleTabService.readyToOpenChildTab(br.selectedTab, true);
for(var h in hrefs)
    br.addTab(h);
if("TreeStyleTabService" in window)
    TreeStyleTabService.stopToOpenChildTab(br.selectedTab);

заменить на

Выделить код

Код:

var res = [];
for(var h in hrefs)
	res.push(h);
Components.classes["@mozilla.org/widget/clipboardhelper;1"]
	.getService(Components.interfaces.nsIClipboardHelper)
	.copyString(res.join("\n"));

Круто. Спасибо тебе за твой труд и оперативность :)

скрытый текст

Выделить код

Код:

(function() {
var mask = "..."; // простой фильтр
// или регулярное выражение:
// var mask = /.../;
var maskForLinks = false; // фильтровать по "названию" ссылки

var isRegExp = typeof mask != "string";
var allLinks = !mask;
function check(val) {
    return isRegExp ? mask.test(val) : val.toLowerCase().indexOf(mask) > -1;
}

var links = content.document.getElementsByTagName("a");
var hrefs = {};
var lnk, h, txt;
for(var i = 0, len = links.length; i < len; i++) {
    lnk = links[i];
    h = lnk.href;
    txt = lnk.textContent;
    if(allLinks || check(maskForLinks ? h : txt))
        hrefs[h] = 1;
}
var res = [];
for(var h in hrefs)
    res.push(h);
Components.classes["@mozilla.org/widget/clipboardhelper;1"]
    .getService(Components.interfaces.nsIClipboardHelper)
    .copyString(res.join("\n"));


Вопрос следующий, возможно ли сделать так чтобы копировались в буфер не ссылки а какой-либо текст по маске или соответствующий регулярному выражению

vanchelo пишет

Вопрос следующий, возможно ли сделать так чтобы копировались в буфер не ссылки а какой-либо текст по маске или соответствующий регулярному выражению

Что за текст и где он будет находиться на странице?

Infocatcher пишет
vanchelo пишет

Вопрос следующий, возможно ли сделать так чтобы копировались в буфер не ссылки а какой-либо текст по маске или соответствующий регулярному выражению

Что за текст и где он будет находиться на странице?

Любой видимый текст, т.е. например нужно скопировать текст на странице XXXX.
Либо любой текст отвечающий шаблону или по рег. выр. между тегами <html>...</html>

В общем случае это довольно-таки нетривиально.
Скажем, може быть такой текст:

Выделить код

Код:

abc<strong>de</strong>fgh

Или даже

Выделить код

Код:

abc<style type="text/css">* { color: black; }</style>defgh

Хотя визуально и там, и там – «abcdefgh».

Опять же, что считать границами текста.

Если проверять только текстовые узлы, то примерно вот так:

скрытый текст

Выделить код

Код:

var mask = "кар";
// var mask = /кар/i;
var check = typeof mask == "string"
    ? function(s) { return s.toLowerCase().indexOf(mask) != -1; }
    : function(s) { return mask.test(s); };

var emptyMask = /^\s*$/;
var notInTags=["head", "noscript", "option", "script", "style", "title", "textarea"];

var doc = content.document;
var res = doc.evaluate(
    "//text()[not(ancestor::" + notInTags.join(") and not(ancestor::") + ")]",
    doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null
);
var r = [];
var node, tc;
for(var i = 0; node = res.snapshotItem(i); i++) {
    tc = node.textContent;
    if(emptyMask.test(tc))
        continue;
    if(check(tc))
        r.push(tc);
}
r = r.join("\n");
Components.classes["@mozilla.org/widget/clipboardhelper;1"]
    .getService(Components.interfaces.nsIClipboardHelper)
    .copyString(r);
//alert(r);


Для http://www.google.ru/ копирует

Картинки
Карты

P.S. Идея взята из http://userscripts.org/scripts/review/23362.

02-08-2009 20:19:01
P.P.S. С регулярными выражениями есть баг.

02-08-2009 20:29:24
[UPD]
Забыл про фреймы. =)
С фреймами вот так:

скрытый текст

Выделить код

Код:

var mask = "кар";
//var mask = /кар/i;
var check = typeof mask == "string"
    ? function(s) { return s.toLowerCase().indexOf(mask) != -1; }
    : function(s) { return mask.test(s); };

var emptyMask = /^\s*$/;
var notInTags=["head", "noscript", "option", "script", "style", "title", "textarea"];
var xPath = "//text()[not(ancestor::" + notInTags.join(") and not(ancestor::") + ")]";
var r = [];

function findText(doc) {
    var res = doc.evaluate(xPath, doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    var node, tc;
    for(var i = 0; node = res.snapshotItem(i); i++) {
        tc = node.textContent;
        if(emptyMask.test(tc))
            continue;
        if(check(tc))
            r.push(tc);
    }
}
function parseWin(win) {
    findText(win.document);
    for(var i = 0, len = win.frames.length; i < len; i++)
        parseWin(win.frames[i]);
}
parseWin(content);

r = r.join("\n");
Components.classes["@mozilla.org/widget/clipboardhelper;1"]
    .getService(Components.interfaces.nsIClipboardHelper)
    .copyString(r);
//alert(r);

Скажите плиз как выдержать синтаксис в скрипте. Вот регулярное выражение (http:\/\/)?([\d\w\-]+(\.[\d\w\-]+)*).edit.\d{7}. для открытия ссылки типа

скрытый текст
Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст.

Тема перенесена из форума «iMacros» в форум «Архив тем».