Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.10.2018, 12:03
Новичок на форуме
Отправить личное сообщение для Nick1 Посмотреть профиль Найти все сообщения от Nick1
 
Регистрация: 10.01.2015
Сообщений: 7

Скрипт для Greasemonkey (saved from URL)
Здравствуйте.
Подскажите скрипт для Greasemonkey, который бы вставлял в начало html-страницы комментарий со ссылкой на текущий URL, включая знак "#", если он есть и символы после него (как это сделано в браузерах на основе Chromium).

Так, например, чтобы при посещении страницы ссылка вида "https://ru.wikipedia.org/wiki/Mozilla_Firefox#Движок_Quantum" была бы записана как комментарий в начало html-страницы.

И так для каждой посещаемой страницы. И если произошел переход по якорю "#", то записывался бы новый, измененный якорь (если это возможно).

Кто подскажет такой скрипт???
Ответить с цитированием
  #2 (permalink)  
Старый 10.10.2018, 16:22
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

var comment = (function createCurrentURLComment(window){
  var document = window.document,
      location = window.location, 
      html = document.documentElement;
  
  var comment = html.insertBefore( 
    document.createComment(location.href), 
    html.firstChild
  );
  
  window.addEventListener('popstate', function(){
    comment.data = location.href;
  }, false);
  
  return comment
}(window));
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 11.10.2018, 18:23
Новичок на форуме
Отправить личное сообщение для Nick1 Посмотреть профиль Найти все сообщения от Nick1
 
Регистрация: 10.01.2015
Сообщений: 7

Aetae
Спасибо за данный скрипт! Он также сохраняет правильно и содержимое после якоря "#".

Но, как можно его модифицировать, чтобы получилось так:
Строка 1:<!DOCTYPE html>
Строка 2:<!-- saved from url=https://ru.wikipedia.org/wiki/Mozilla_Firefox#Движок_Quantum -->
Строка 3: ...

Т.е. чтобы этот комментарий был на отдельной 2-ой строке и чтобы в начале комментария, а также и в конце после окончания ссылки (перед "-->") стоял бы пробел. Это нужно, чтобы ссылка правильно отображалась в некоторых редакторах (например, в AkelPad).
Ответить с цитированием
  #4 (permalink)  
Старый 11.10.2018, 20:33
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

var comment = (function createCurrentURLComment(window){
  var prefix = ' saved from url=',
      postfix = ' ',
      document = window.document,
      location = window.location,
      comment = document.createComment(prefix + location.href + postfix);
   
  document.documentElement.before(comment);

  window.addEventListener('popstate', function(){
    comment.data = prefix + location.href + postfix;
  }, false);
   
  return comment
}(window));
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 15.10.2018, 18:23
Новичок на форуме
Отправить личное сообщение для Nick1 Посмотреть профиль Найти все сообщения от Nick1
 
Регистрация: 10.01.2015
Сообщений: 7

Aetae
Большое спасибо за данный скрипт!

И еще вопрос:
Можно ли как-то сделать, чтобы декодировался еще и punycode при сохранении ссылки.
Например вместо:
"https://ru.wikipedia.org/wiki/Mozilla_Firefox#%D0%94%D0%B2%D0%B8%D0%B6%D0%BE%D0% BA_Quantum"

сохранялась бы ссылка вида:
"https://ru.wikipedia.org/wiki/Mozilla_Firefox#Движок_Quantum"

Дело в том еще, что в URL могут быть пробелы, специальные символы и еще даже различные значки...
Или это сложно реализовать такое декодирование???
Ответить с цитированием
  #6 (permalink)  
Старый 15.10.2018, 18:43
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

alert(decodeURI("https://ru.wikipedia.org/wiki/Mozilla_Firefox#%D0%94%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA_Quantum"));

Последний раз редактировалось Dilettante_Pro, 15.10.2018 в 18:46.
Ответить с цитированием
  #7 (permalink)  
Старый 15.10.2018, 20:49
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Для паникода встроенной фукцнии (пока?) нет, использую такую:
function punycodeDecodeURI(href) {
    const at = href.indexOf('@') + 1 || href.indexOf('://') + 3 || href.indexOf(':') + 1;
    const sl = href.indexOf('/', at) + 1 || href.length;
    return href.slice(0, at)
      + href.slice(at, sl).replace(
        /(^|\.)xn--(?:([a-z0-9-]+)-)?([a-z0-9]+)/g,
        function(text, separator, ascii, utf) {
          const output = Array.from(ascii || '', c => c.charCodeAt(0));
          const input  = Array.from(utf, c => c.charCodeAt(0) - (c < ':' ? 0x16 : 0x61));
          const inputLength = input.length;

          for (let x = 0, i = 0, j = 0, n = 128, b = 72, o = output.length + 1; x < inputLength; j = i) {
            for (let w = 1, k = 36, d, t;; k += 36) {
              if (x === inputLength) return text; //invalid-input
              d = input[x++];
              if (d > ((2147483647 - i) / w | 0)) return text; //overflow
              i += d * w;
              t = k <= b ? 1 : k >= b + 26 ? 26 : k - b;
              if (d < t) break;
              if (w > (2147483647 / (t = 36 - t) | 0)) return text; //overflow
              w *= t;
            }
            b = j === 0 ? i / 700 | 0 : i - j >> 1;
            b += b / o | 0;
            for(j = 0; b > 455; j += 36) b = b / 35 | 0;
            b = j + 36 * b / (b + 38) | 0;
            if ((j = i / o | 0) > 2147483647 - n) return text; //overflow
            n += j;
            i %= o++;
            output.splice(i++, 0, n);
          }

          return separator + String.fromCodePoint(...output);
        }
      )
    + href.slice(sl)
  }
на вход принимает нормализованную браузером ссылку(location.href, a.href) а не всё подряд, что возможно по стандарту, за счёт чего сильно упрощена.
__________________
29375, 35

Последний раз редактировалось Aetae, 03.11.2018 в 19:30.
Ответить с цитированием
  #8 (permalink)  
Старый 15.10.2018, 21:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

Aetae,
Ответить с цитированием
  #9 (permalink)  
Старый 03.11.2018, 19:08
Новичок на форуме
Отправить личное сообщение для Nick1 Посмотреть профиль Найти все сообщения от Nick1
 
Регистрация: 10.01.2015
Сообщений: 7

Dilettante_Pro,
Это вообще к чему???
Мне нужно декодирование не этой одной отдельной ссылки, а ссылки/ссылок в исходном коде страницы. Эта приведена просто для примера. Читайте внимательно!

Aetae,
Спасибо и за такой скрипт!
Но, как его можно применить для Greasemonkey???

Т.е. нужно, чтобы в исходном коде декодировалась бы punycode-ссылка из:
<!-- saved from url="ссылка в punycode" -->

Можно ли такое как-нибудь реализовать???
---------
P.S. Извините за столь долгий ответ...
Ответить с цитированием
  #10 (permalink)  
Старый 03.11.2018, 19:26
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Nick1, я так понял ты вообще не знаешь js?
var comment = (function createCurrentURLComment(window){
  function punycodeDecodeURI(href) {
    const at = href.indexOf('@') + 1 || href.indexOf('://') + 3 || href.indexOf(':') + 1;
    const sl = href.indexOf('/', at) + 1 || href.length;
    return href.slice(0, at)
      + href.slice(at, sl).replace(
        /(^|\.)xn--(?:([a-z0-9-]+)-)?([a-z0-9]+)/g,
        function(text, separator, ascii, utf) {
          const output = Array.from(ascii || '', c => c.charCodeAt(0));
          const input  = Array.from(utf, c => c.charCodeAt(0) - (c < ':' ? 0x16 : 0x61));
          const inputLength = input.length;

          for (let x = 0, i = 0, j = 0, n = 128, b = 72, o = output.length + 1; x < inputLength; j = i) {
            for (let w = 1, k = 36, d, t;; k += 36) {
              if (x === inputLength) return text; //invalid-input
              d = input[x++];
              if (d > ((2147483647 - i) / w | 0)) return text; //overflow
              i += d * w;
              t = k <= b ? 1 : k >= b + 26 ? 26 : k - b;
              if (d < t) break;
              if (w > (2147483647 / (t = 36 - t) | 0)) return text; //overflow
              w *= t;
            }
            b = j === 0 ? i / 700 | 0 : i - j >> 1;
            b += b / o | 0;
            for(j = 0; b > 455; j += 36) b = b / 35 | 0;
            b = j + 36 * b / (b + 38) | 0;
            if ((j = i / o | 0) > 2147483647 - n) return text; //overflow
            n += j;
            i %= o++;
            output.splice(i++, 0, n);
          }

          return separator + String.fromCodePoint(...output);
        }
      )
    + href.slice(sl)
  }

  function getSavedFrom(){
    return ' saved from url=' + decodeURI(punycodeDecodeURI(location.href)) + ' ';
  }
  
  var document = window.document,
      location = window.location,
      comment = document.createComment(getSavedFrom());
    
  document.documentElement.before(comment);
 
  window.addEventListener('popstate', function(){
    comment.data = getSavedFrom();
  }, false);
    
  return comment
}(window));
__________________
29375, 35

Последний раз редактировалось Aetae, 03.11.2018 в 19:30.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставить остановку в скрипт для фотошопа aarisham Общие вопросы Javascript 2 21.03.2016 13:18
Где найти скрипт - Социальный Замок для html ? klimentino Общие вопросы Javascript 1 25.10.2013 06:39
скрипт для браузерки ванка Общие вопросы Javascript 11 11.10.2013 12:20
поиск классов внутри тега yozuul jQuery 24 14.06.2013 22:00
javascript для перехвата URL открытой страницы rafael Firefox/Mozilla 0 19.11.2011 14:48