LINUX.ORG.RU

Скриншот+вопрос (снова), про яваскрипт на этот раз

 , , , ,


1

2

Здравствуйте.

Практикую домашнюю страницу мозиллы в виде синхронизированного со своими закладками «десктопа» (раскурочил для этого грязными лапами старый японский аддон, немного подробностей на втором скрине).

В связи с этим прошу просветить полного нубяру в яваскрипте, как мне внутри js, уже имея в переменной «rpath» полный урл сайта, получить из него в переменную «faviconurl» линк на фавиконку?

Cмотрю на найденное в поисковике

faviconLink = doc.querySelector('link[rel="icon"], link[rel="shortcut icon"]');
, как баран на новые ворота, и не понимаю, где у ней кнопка поле для входной переменной, куда мне свой rpath заряжать-то? А то рандомный юникодовый alt фавиконки, вбитый мной в img.onerror - это, конечно, красиво, но хотелось бы этого поменьше.

Четвёртая малинка, иксы, awesome, firefox, gvim. Текстовые юникодовые же интерактивные датчики.

В нижней панельке проматывается рандомно вытянутый с флибусты «Клим Самгин» с синхронной тринадцатиголосной RHVoice-озвучкой (одного и того же диктора слушать скучно, поэтому они откалиброваны по высоте, скорости, громкости, и каждые 150 секунд рандомно друг друга сменяют, немного подробностей на третьем скрине).

Терминал st, и там чумовейший недавно мной открытый для себя автодополнительный менеджер fzf (четвёртый скрин).

Спасибо за внимание, прошу просветить.

★★★★★

Проверено: hobbit ()
Последнее исправление: piyavking (всего исправлений: 18)

На странице ЛОРа фавиконт задан так

<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">

Хоть путь и задан относительно, браузер сам разрешает его выдавая из этого

ipath = document.querySelector('link[rel="icon"], link[rel="shortcut icon"]');
console.log(ipath.href)

Полноценную ссылку

https://www.linux.org.ru/favicon.ico

Возможно потому что на ЛОРе явно задан базовый путь, для явного разрешения относительных ссылок

<base href="https://www.linux.org.ru/">

Базовых путей может быть несколько.

На других сайтах проверять лень.
А так в js можно просто resut = rpath + filepath; и всё, конкатенация строк идёт просто через оператор сложения. В dev консоли браузера у возврата от функции поставь точку, но выплюнет тебе что там внутри того что вернула функция.

На всякий случай ещё напомню, что например внутри css если ты туда полезешь, относительные пути разрешаются относительно пути самого css файла, а не относительно базового путинепутю сайта.


Может я тебе тут и так понятную тебе фигню написал, а может это то что ты спрашивал.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

эээ...

я всё равно ничего не понял(

Как строки складывать-то я знаю. Я не понимаю, куда свой rpath пихать)))

JS-то у меня в расширении, не на сайте, с которого надо снять фавиконку. Поэтому и rpath, что нужно выражение:

favurl=бла-бла-бла(rpath)

И я не вижу в твоих примерах такого. Ух я и приморозился. Наверно магнитная буря)))

piyavking ★★★★★
() автор топика
Ответ на: комментарий от dataman

Dторой раз так выступаю, да. Пуркуа бы, собсна, и не па?)

piyavking ★★★★★
() автор топика
Ответ на: комментарий от piyavking

Дополняя:

ipath = document.querySelector('link[rel="icon"], link[rel="shortcut icon"]');

почему тут нету нигде моего «rpath»? ведь ipath должен получаться из него?

я не понимаю(

piyavking ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Кажется, я понял, в чём расхождение. И ты, и интернет даёте мне советы о том, как получить фавикон страницы из скрипта, находящегося на этой же странице.

А я хочу в скрипте из произвольной ссылки получить её фавиконку, понимаешь? У меня rpath меняется в скрипте, мне нужны разные фавиконки разных сайтов.

piyavking ★★★★★
() автор топика
Ответ на: комментарий от vbr

Внешние сервисы не нужны. Они умеют ох как не во всё. Ни онионы, ни игдразили, ни айтупишечки и так далее гугло- и прочими сервисами не охвачены и не предполагается. Ах если бы всё было так просто.

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 2)
Ответ на: комментарий от piyavking

Ну тогда скачивай HTML и парси нужные теги, готового API для этого я не знаю. Если хочется по-быстрому, можешь просто example.com/favicon.ico использовать, для какого-то процента сайтов сработает.

vbr ★★★★★
()
Ответ на: комментарий от vbr

для какого-то процента сайтов сработает

Сработает почти со всеми сайтами.

А вот с PWA-first — тут уж как повезёт.

mord0d ★★★★★
()
Ответ на: комментарий от vbr

скачивай HTML и парси нужные теги

Вот именно о том, как это делается средствами яваскрипта, вопрос и был. По-быстрому оно всё у меня есть. Я хочу по-нормальному.

piyavking ★★★★★
() автор топика
Ответ на: комментарий от piyavking

Не совсем понятно из твоего описания, где твой JS выполняется. Если на каком-то сайте, то никак. Если в расширении, то fetch + DOMParser, очевидно.

vbr ★★★★★
()
Ответ на: комментарий от mord0d

Сработает почти со всеми сайтами.

Да нет, совсем не со всеми. favicon.ico это самое убогое, что можно придумать, и многие сайты используют соответствующие теги для переопределения фавиконки на HiDPI png хотя бы.

vbr ★★★★★
()
Ответ на: комментарий от vbr

favicon.ico это самое убогое, что можно придумать … для переопределения фавиконки на HiDPI png хотя бы

как же эти тупые бездари до HiDPI в 90х не додумались. ух негодники.

еще вообще не понимаю, почему вместо i9 они делали сраные пентиумы.

usi_svobodi
()
Последнее исправление: usi_svobodi (всего исправлений: 1)
Ответ на: комментарий от vbr

Сработает почти со всеми сайтами.

Да нет, совсем не со всеми. favicon.ico это самое убогое, что можно придумать, и многие сайты используют соответствующие теги для переопределения фавиконки на HiDPI png хотя бы.

А я и не утверждал что /favicon.ico это что-то нормальное. Но это что-то дефолтное, и если сайт делали не полные смузихлёбы, то в качестве fallback оно там есть.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Нет, это не дефолтное. Если у тебя HTML написан корректно, нет никакой причины его там держать. Если сайт делали не полные смузихлёбы, конечно.

vbr ★★★★★
()
Ответ на: комментарий от usi_svobodi

как же эти тупые бездари до HiDPI в 90х не додумались. ух негодники.

Да, раньше люди были довольно глупые. Много чего приходится исправлять.

vbr ★★★★★
()
Ответ на: комментарий от vbr

Нет, это не дефолтное.

Всё с тобой понятно.
Дальше даже читать не стал.

mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)
Ответ на: комментарий от vbr

Да, раньше люди были довольно глупые. Много чего приходится исправлять.

Раньше в инструкции писали как регулировать клапана в автомобиле, а теперь что не стоит пить антифриз.

mord0d ★★★★★
()
Ответ на: комментарий от vbr

да, оно в расширении

fetch + DOMParser

Понял, буду изучать. Вроде именно то, что мне надо. А я этот fetch на html-адрес натравлю, где страница генерируется движком, то он выдаст хтмл-код, который движок нагенерил, или исходный полуфабрикат, в котором инфа перемешана или отсутствует?

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 1)
Ответ на: комментарий от mord0d

а теперь что не стоит пить антифриз

Этот тип инструкций тоже устарел. Теперь стали писать с чем лучше мешать антифриз чтоб утром голова не болела.

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 1)
Ответ на: комментарий от piyavking

fetch получит то, что отдаст ему веб-сервер. Если там SPA, то страница будет, считай, пустой, но с большой долей вероятности там всё же будет правильный тег link для иконки.

static_lab ★★★★★
()
Ответ на: комментарий от piyavking

Грубо говоря, приложение на чистых скриптах, где исходный index.html служит исключительно для запуска.

static_lab ★★★★★
()
Ответ на: комментарий от piyavking

DeepSeek выдаёт такую функцию:

async function getShortcutIcon(url) {
  try {
    const response = await fetch(url);
    
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    
    const html = await response.text();
    const parser = new DOMParser();
    const doc = parser.parseFromString(html, 'text/html');
    
    // Получаем базовый URL из тега <base> или используем оригинальный URL
    const baseElement = doc.querySelector('base');
    let baseUrl = url;
    
    if (baseElement && baseElement.href) {
      try {
        baseUrl = new URL(baseElement.href, url).href;
      } catch (e) {
        console.warn('Invalid base URL, using original URL:', baseElement.href);
        baseUrl = url;
      }
    }
    
    // Ищем shortcut icon
    const iconSelectors = [
      'link[rel="shortcut icon"]',
      'link[rel="icon"]',
      'link[rel*="icon"]',
      'link[rel="apple-touch-icon"]',
      'link[rel="apple-touch-icon-precomposed"]'
    ];
    
    let iconLink = null;
    let iconElement = null;
    
    for (const selector of iconSelectors) {
      iconElement = doc.querySelector(selector);
      if (iconElement && iconElement.href) {
        iconLink = iconElement.href;
        break;
      }
    }
    
    // Обрабатываем относительные пути с учетом base URL
    if (iconLink) {
      try {
        // Если это относительный путь (не начинается с http)
        if (!iconLink.startsWith('http') && !iconLink.startsWith('data:')) {
          iconLink = new URL(iconLink, baseUrl).href;
        }
      } catch (e) {
        console.warn('Could not resolve icon URL:', iconLink, e);
      }
    }
    
    return iconLink;
    
  } catch (error) {
    console.error('Error fetching shortcut icon:', error);
    return null;
  }
}
static_lab ★★★★★
()
Последнее исправление: static_lab (всего исправлений: 1)
Ответ на: комментарий от static_lab

Спасибо, добрый человек! Буду приспосабливать)

piyavking ★★★★★
() автор топика

Просто про скрин…

В нижней панельке проматывается рандомно вытянутый с флибусты «Клим Самгин» с синхронной тринадцатиголосной RHVoice-озвучкой (одного и того же диктора слушать скучно, поэтому они откалиброваны по высоте, скорости, громкости, и каждые 150 секунд рандомно друг друга сменяют, немного подробностей на третьем скрине).

Хм, а это правда нормально? Перечитал 2 раза … эээ..

mx__ ★★★★★
()
Ответ на: комментарий от mx__

С трёх источников (флибуста, мракопедия, крипер.ру, если конкретно) система тянет случайный текст.

Этот случайный текст система читает вслух, синхронно показывая читаемый в данный момент текстовый фрагмент в нижней панели оконного менеджера.

Это осуществляется с помощью голосового движка RHVoice, в режиме периодической смены голоса (13 вариантов). На скриншоте номер три виден скрипт, это осуществляющий, и текстовый файл, использующийся для подгонки голосов друг к другу для достижения одинакового темпа, громкости, и средней тональности.

Да, это правда нормально, и никаких проблем в стиле изложения не вижу. Сожалею, что не угодил...

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 1)
Ответ на: комментарий от piyavking

Я не про это, ну новости по линукс в бегущей строке снизу (и голосом) можно понять или музон какой. Но чтобы книгу так … ну х.з.

mx__ ★★★★★
()
Ответ на: комментарий от mx__

новости по линукс в бегущей строке снизу (и голосом) можно понять или музон какой

Эрэсэски я пускал тоже, и про линукс, и так, целый тег в агрегаторе был, сейчас скрипт куда-то зарыл. Сейчас на крипипастах висну - болбочет какая-нибудь стори, и норм под неё отъезжать в небытие, порой бриллиантового качества контент скрипт цепанёт. А так, буфер обмена послушать, очень, бывает, кстати приходится - скрипту ж всё равно, что ему на вход подать - то он и прочтёт.

Или музон под настроение, естественно. Но выводить в панельку как-то не тянет. Пару раз миксовал даже пасты с онлайн-станцией, ничего так получалось.

RHVoice вообще очень клёвый движок, после очень краткой притирки ушей и минимальной отстройки голосов воспринимается абсолютно естественно. Там разрабы слепые, уж в чём-в-чём, а в озвучке эти люди соображают.

А, ну и если интересуешься - у такой вещи, как аудиокнига, есть свой вполне себе круг потребителя, например. Среди дальнобоев, например, вполне себе не редкость в плеер каких-нибудь попаданцев зарядить)

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 4)
Ответ на: комментарий от static_lab

Вписал в content.js, перепаковал и переставил аддон. Упёрся. Фатальных ошибок нет, но ни одну иконку не затащило.

Мозилла пишет в консоли "...(Reason: CORS request did not succeed). Status code: (null)...".

НЯП, это политика файрфокса или политика яваскрипта вообще или еще что, но расширению парсить сторонний сайт не позволено. Я так понял. В эбаут:конфиг похожие по смыслу ключики пощёлкал - без эффекта...

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 5)
Ответ на: комментарий от piyavking

Это политика CORS вообще: хоть расширение выполняется из своего контекста, а не из контекста страницы, однако ему всё равно не позволяется просто так дёргать чужие домены.

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

Не, ну это уже совсем из пушки по воробьям...

Странно, задачка типовейшая, давно библиотека какая-нибудь штатная дрлжна была бы быть для этого...

piyavking ★★★★★
() автор топика
Ответ на: комментарий от vbr

А почему ж тогда мне мозилла пишет, что запрет?

Буду дальше разбираться...

Нет, ну этот ваш линух. Я просто хотел фавиконку! Бдыщ - и вот я уже учу яваскрипт)

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 3)
Ответ на: комментарий от piyavking

Надо в манифесте прописать разрешения.

Если manifest v2, то "permissions": ["*://*/*"].

Если manifest v3, то "host_permissions": ["*://*/*"].

vbr ★★★★★
()
Ответ на: комментарий от somemong

У гениев мысли сходятся, вестимо)

piyavking ★★★★★
() автор топика
Ответ на: комментарий от z0idator

минималистично и удобно

Спасибо на добром слове - да, как-то уже в кости въелось не стесняться приступов оголтелого, жёсткого феншуя. Глаза и руки, чай, не казённые, бутылочное, самое что ни на есть, горлышко. Штатный файрфоксовый хомяк надлежит сразу же накрепко заколотить досками и приморозить целый зоопарк паразитов, который вокруг этого кошмара пасётся - хвала эбаут:конфигу, милостивому, милосердному...

piyavking ★★★★★
() автор топика
Ответ на: комментарий от piyavking

Но всё-таки не полностью, некоторые фавиконки оно продолжает не видеть, «а они есть»...

piyavking ★★★★★
() автор топика
Ответ на: комментарий от IIIypuk

Ты, блин, переоцениваешь мою мощь. Я и в словари-то тоже только вкатываюсь)

else if (url) {}

Понял. А в фигурных скобках уже оперировать url как переменной. Спасибо!

piyavking ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.