Скрипт для Greasemonkey (saved from URL)
Здравствуйте.
Подскажите скрипт для Greasemonkey, который бы вставлял в начало html-страницы комментарий со ссылкой на текущий URL, включая знак "#", если он есть и символы после него (как это сделано в браузерах на основе Chromium). Так, например, чтобы при посещении страницы ссылка вида "https://ru.wikipedia.org/wiki/Mozilla_Firefox#Движок_Quantum" была бы записана как комментарий в начало html-страницы. И так для каждой посещаемой страницы. И если произошел переход по якорю "#", то записывался бы новый, измененный якорь (если это возможно). Кто подскажет такой скрипт??? |
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)); |
Aetae
Спасибо за данный скрипт! Он также сохраняет правильно и содержимое после якоря "#". Но, как можно его модифицировать, чтобы получилось так: Строка 1:<!DOCTYPE html> Строка 2:<!-- saved from url=https://ru.wikipedia.org/wiki/Mozilla_Firefox#Движок_Quantum --> Строка 3: ... Т.е. чтобы этот комментарий был на отдельной 2-ой строке и чтобы в начале комментария, а также и в конце после окончания ссылки (перед "-->") стоял бы пробел. Это нужно, чтобы ссылка правильно отображалась в некоторых редакторах (например, в AkelPad). |
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)); |
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 могут быть пробелы, специальные символы и еще даже различные значки... Или это сложно реализовать такое декодирование??? |
alert(decodeURI("https://ru.wikipedia.org/wiki/Mozilla_Firefox#%D0%94%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA_Quantum")); |
Для паникода встроенной фукцнии (пока?) нет, использую такую:
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) а не всё подряд, что возможно по стандарту, за счёт чего сильно упрощена. |
Aetae,
:thanks: |
Dilettante_Pro,
Это вообще к чему??? Мне нужно декодирование не этой одной отдельной ссылки, а ссылки/ссылок в исходном коде страницы. Эта приведена просто для примера. Читайте внимательно! Aetae, Спасибо и за такой скрипт! Но, как его можно применить для Greasemonkey??? Т.е. нужно, чтобы в исходном коде декодировалась бы punycode-ссылка из: <!-- saved from url="ссылка в punycode" --> Можно ли такое как-нибудь реализовать??? --------- P.S. Извините за столь долгий ответ...:thanks: |
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)); |
Цитата:
Еще раз большое Вам спасибо за скрипты!!! :thanks: |
Часовой пояс GMT +3, время: 01:13. |