LINUX.ORG.RU

LORPic: Пишем плагин для браузеров Mozilla Firefox и Chrome/Chromium

 , ,

LORPic: Пишем плагин для браузеров Mozilla Firefox и Chrome/Chromium

5

2

Прювет, котаны!11

Сегодня мы с вами постараемся написать маленький, но очень полезный плагин расширяющий возможности любителей юмористически-сатирической и даже немного технической площадки линуксоидов — форума linux.org.ru.

Плагин будет представлять из себя расширение для браузеров Mozilla Firefox и Chrome/Chromium, позволяющее отображать изображения непосредственно на страницах ресурса.

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

Без лирики… Поехали…

КАРТИНКИ ДЛЯ ТЕСТА

Котан 1: https://0x0.st/oO70.jpg

Котан 2: https://0x0.st/oO7G.jpg

Котан 3: https://0x0.st/oO7D.jpg

УСТАНОВКА

git clone https://git.lnx4.ru/lnx4/lorpic

В браузере перейти в настройки, далее - расширения, включить режим разработчика (для chromium, в firefox выбрать: «установить дополнение из файла») и загрузить каталог с расширением (для firefox — выбрать файл manifest.json).

Расширение работает на всех страницах форума (за исключением трекера и т. п., о чем подробнее расскажу дальше). Требуется прямая ссылка на файл изображения. Ссылка не должна отдавать html код, а должна содержать изображение с расширением jpg, jpeg или png в URL.

Подобную загрузку можно осуществить используя бесплатный сервис https://0x0.st.

Пример использования: curl -F'file=@yourfile.png' https://0x0.st

Ответом запроса станет результирующая ссылка на изображение.

КАК ПИСАТЬ РАСШИРЕНИЯ ДЛЯ БРАУЗЕРОВ?

На это примере разберем, что именно представляет из себя плагин (расширение, WebExtensions) для браузеров. В данном случае, код практически кросс-платформенный, подходит как для Mozilla Firefox, так и для Chrome/Chromium.

Структура каталога следующая:

- chromium-lorpic
--- 128-icon.png
--- 32-icon.png
--- 64-icon.png
--- app.js
--- manifest.json
--- style.css

Отличие заключается только в номере версии файла манифеста manifest.json: для firefox следует указывать версию 2, а для Chrome/Chromium — 3. Можно указать везде версию 2, но тогда Chromium будет жаловаться на deprecated (поддержка версии 2 заканчивается 2023 году).

Основную ценность для нас представляют файлы manifest.json, app.js и style.css. Разберем их по порядку.

manifest.json

В файле манифеста расположены основные настройки

{
  "manifest_version": 3,
  "name": "LORPic",
  "version": "1.0",
  "description": "Плагин отображения картинок для LOR",
  "icons": {
  "32": "32-icon.png",
  "64": "64-icon.png",
  "128": "128-icon.png"
},
"content_scripts": [
    {
      "matches": [ "*://*.linux.org.ru/gallery/*/*", 
                   "*://*.linux.org.ru/articles/*/*", 
                   "*://*.linux.org.ru/news/*/*", 
                   "*://*.linux.org.ru/forum/*/*" ],
      "js": [ "app.js" ],
      "css": [ "style.css" ]
    }
  ]
}

Раздел matches содержит регулярные выражения, тех страниц, на которых будет работать плагин. Символ звездочки означает любое выражение или его отсутствие. Таким образом, плагин будет работать на всех поддоменах и основном домене в указанных нами разделах сайта.

app.js

(function() {
  // Code Here
  const formats = ['jpeg', 'jpg', 'png'];
  let links = document.querySelectorAll('a[href]:not([itemprop])');

  links.forEach(function(link){
  let url = link.getAttribute('href');
  let ext = _getUrlExt(url);

  if(formats.includes(ext)){
      let content = link.textContent;

      if(content != 'Просмотр'){
        let image = document.createElement("img");

        image.setAttribute('class', 'lorpic');
        image.setAttribute('src', url);
        //link.replaceWith(image);
        link.innerHTML = "";
        link.appendChild(image);
        link.setAttribute('target', '_blank');
      }
    }
  });

  function _getUrlExt(url){
    return url.split('.').pop();
  }
})();

Здесь все просто и банально. В константной переменной formats указываем массив, по которому будем сверять расширения изображения, получаемых из ссылок на страницах сайта.

В цикле проходимся по всем ссылкам доступным на странице, и если ссылка содержит префикс (для получения используется функция _getUrlExt) из массива — тогда обрабатываем. Создаем элемент изображения и вставляем его как дочерний элемент ссылки, попутно удаляя содержимое. Так же присваиваем необходимые атрибуты. Чтобы не обрабатывались ссылки на изображения находящиеся внизу текста в разделе «Галерея» - используем условие content != 'Просмотр'

style.css

a img.lorpic {
  display: block;
  max-width: 33%;
  height: auto;
}

Не менее просто. Каскадные стили. В предыдущем коде мы присвоили ссылкам с изображениями атрибут class="lorpic", теперь делаем изображения блочным элементом, т.к. ссылки могут быть в середине текста, а картинка должна отображаться с переносами.

Свойством max-width задаем максимальную ширину изображения относительно родительского элемента страницы. 33% на мой взгляд оптимальный вариант. По клику - картинка открывается в полном разрешении в соседней вкладке, за что отвечает атрибут target="_blank" добавленный скриптом на предыдущем шаге.

The END

UPD1. Предлагаю указать ресурс https://0x0.st в правилах разметки форума.

UPD2. У меня нет аккаунтов разработчика под Mozilla Firefox, Chrome/Chromium, но если зайдет, не только в образовательных целях, и найдется человек готовый опубликовать расширение, — буду только рад. Со своей стороны могу пообещать доработать до нормального состояния.



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

Ответ на: комментарий от LINUX-ORG-RU

С почином!

И я поздравляю форумчан с новым разделом! А на Макса пожалуюсь в сообщество писателей, 3 единицы скора накинул, ну ваще :D Ожидания на 5 звезд были, а тут…

В целом, @Satori прав, но не по поводу «котаны!11», а по самому качеству. Я тоже за хорошую подготовку материала.

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

Если хочется, чтобы этот раздел имел смысл - премодерация должна быть качественной, не прям сейчас, людей мало, но в перспективе - думаю, да. Имхо.

lnx4
() автор топика

Круто. Но в попугаях в самом движке эту же логику впилить было бы правильнее… С выключенным по умолчанию флажком в профиле «на фиг картинки» для старпёров.

pr849
()
Ответ на: комментарий от grem

Понял, спасибо. Я почему-то всегда думал, что «оно само» здесь работает (автоматически).

Доберусь до ноута через полчаса - поправлю.

UPD. Блин, уже поздно. Не могу отредактировать.

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

Само и работает, его модераторы добавляют. Тут не добавили почему-то.

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

Не самый плохой бложик здесь был.

grem ★★★★★
()

UPD1. Предлагаю указать ресурс https://0x0.st в правилах разметки форума.

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

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

Это да, согласен. Но и более нормальных бесплатных сервисов не знаю. Везде протухают, если долго не открывать + ссылки не прямые в большинстве.

Даже думал свой поднять со временем, написать движок и в опенсорс выложить. Толко боюсь, мне быстро место засрут и вместо 500 руб. в месяц, придется тратить на порядок больше (ну, если вечные ссылки делать), а без донатов, на благотворительных началах, как-то не шибко хочется. В общем, обдумываю пока.

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

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

Хммм. Ты сделал из ЛОРа имиджборду.

Время найду - прикручу еще видео, гифки и возможно сервис загрузки картинок. Вообще «lortube» будет :)

lnx4
() автор топика

Статья безусловно на актуальную тему. Можешь в конце добавить ссылок — как писать сам код для расширений, какие API ему доступны и др.?

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

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

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

Этот пример по памяти писал, за исключением файла манифеста (скопировал с другого своего расширения и поправил).

Возможно будет продолжение. Если/когда добавлю функциональность и подготовлю статью (не спеша) - в конце материала опубликую «полезные ссылки» на отдельные разделы.

Полные инструкции описаны в разделах разработчика на сайте Мозиллы и Хрома:

https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions

https://developer.chrome.com/docs/extensions/

PS. Я поправить ОП не могу, истек срок. Если хочешь - добавь ссылки, которые выше.

PPS. Следующую статью планировал пол Live-образу сделать. Потом, думаю, к этому вернуться. Только как по времени будет - пока ничего не могу сказать.

Пиши тоже материал :) У тебя же вроде какая-то неплохая разработка имеется для синхронизации телефонной книги на кьюте?! Я на Qt немного писал, было бы интересно почитать.

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

Я поправить ОП не могу, истек срок.

Похоже на багу, надо будет обсудить в спецтеме. Всё же статья — не новость, тут у автора должно быть больше возможности для правок.

У тебя же вроде какая-то неплохая разработка имеется для синхронизации телефонной книги на кьюте?!

Ну синхронизация — громко сказано. Это редактор/менеджер контактов, работает на данный момент с файлами. Но есть интерактивное сравнение двух файлов. Прямая работа с телефонами планируется, но непонятно, когда.

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

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

Почему форум такой непонятный?

Часовые пояса

Как тут сменить часовой пояс?

Было бы удобнее получать ответы на e-mail из форума на заданный вопрос. (как на др. сайтах)

Я даже вот какой откопал артефакт ушедшей эпохи

да и в форуме тоже удобно по e-mail ответы получать

Но каждый раз старые лоровцы поднимали вой про попсу, про винфак, вот это вот всё. Изначально ЛОР был просто не доделан. А потом из этого сделали какую-то элитарность. Это как в крутых усилителях нет эквалайзера, а в крутых смартфонах нет FM-радио. Иной раз и сам десктопный GNU/Linux страдает такой псевдо-элитарностью, когда отсутствие фичи выдается за фичу.

И скрипты, добавляющие указанный функционал на клиенте, тоже писали всю жизнь.

damix9 ★★★
()

UPD2. У меня нет аккаунтов разработчика под Mozilla Firefox

У меня есть, и я имею сообщить, что получить его проще пареной репы, поэтому не вижу проблем тебе его оформить. Тогда люди смогут его (дополнение) устанавливать с AMO без красноглазенья и без просмотра исходников на предмет вредоносного кода, потому что сервис проверяет публикуемые дополнения.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
15 декабря 2022 г.

Лучше бы это было реализовано скриптом Greasemonkey. Там скрипт заинсталил и всё работает. И оно еще и обновляться может. А так идея очень хорошая. Или тыркать на ссылки или видеть это всё непосредственно в топиках

serg002 ★★★
()
Последнее исправление: serg002 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.