リンク化
by
htsign
2016-10-09 [2016/10/09 02:11:46]
httpやttpやtpなリンクのないURLにリンクを付ける(どこにでもあるやつだけど、標準技術のみで実装している自己満足ver)
@@ -2,12 +2,13 @@
* @title リンク化
* @description httpやttpやtpなリンクのないURLにリンクを付ける(どこにでもあるやつだけど、標準技術のみで実装している自己満足ver)
* @include http://*
- * @license NYSL
+ * @license MIT Lisence
*/
// 【直近の変更】
-// ・作成されるAnchor要素のtarget属性を_blankに
+// ・正規表現パターンを変更(より広範なパターンに対応できるように)
+// (一方で一部の場合に誤爆のリスクがやや高くなりました)
(function(){
@@ -19,7 +20,7 @@
(function(currentNode){
var childs = currentNode.childNodes;
- var pattern= /h?t?tp(s?:\/\/(?:[\w-]+|[^ -~。-゚]+)\.[a-zA-Z]{2,4}[^\s ]*)/g;
+ var pattern = /(h?t?tps?:\/\/(?:[\w-]+|[^ -~。-゚]+)\.[a-zA-Z]{2,4}[^\s ]*)|([^/\s((](?:[\w-]+|[^ -~。-゚]+)\.(?:com|org|net|edu|gov|jp|to|tv|fm|info|(?:co|or|ne|ac|go)\.(?:jp|uk|fr|de))[^\s ))]*)/g;
var regRes = [];
for (var i = 0, l = childs.length; i < l; i++) {
@@ -34,7 +35,7 @@
while (regRes = pattern.exec(self.textContent)) { // マッチがなくなるまでループしてスタック
matchStack.push({
- "mUrl" : "http" + regRes[1],
+ "mUrl" : "http" + getPathname(regRes[0]),
"pStart" : regRes.index,
"pEnd" : pattern.lastIndex
});
@@ -52,4 +53,12 @@
})(document.body);
range.detach();
-})();
+
+ function getPathname(url){
+ var pattern = /:\/\//g;
+ if (pattern.exec(url)) {
+ return url.split(pattern.lastIndex);
+ }
+ return url;
+ }
+})();
/*
* @title リンク化
* @description httpやttpやtpなリンクのないURLにリンクを付ける(どこにでもあるやつだけど、標準技術のみで実装している自己満足ver)
* @include http://*
* @license MIT Lisence
*/
// 【直近の変更】
// ・正規表現パターンを変更(より広範なパターンに対応できるように)
// (一方で一部の場合に誤爆のリスクがやや高くなりました)
(function(){
// Rangeが使えなければ意味が無いので、ここで一旦判定をしています。
if (!document.createRange)
return window.alert("このスクリプトを実行するために必要なAPIが使用できません。");
var range = document.createRange();
(function(currentNode){
var childs = currentNode.childNodes;
var pattern = /(h?t?tps?:\/\/(?:[\w-]+|[^ -~。-゚]+)\.[a-zA-Z]{2,4}[^\s ]*)|([^/\s((](?:[\w-]+|[^ -~。-゚]+)\.(?:com|org|net|edu|gov|jp|to|tv|fm|info|(?:co|or|ne|ac|go)\.(?:jp|uk|fr|de))[^\s ))]*)/g;
var regRes = [];
for (var i = 0, l = childs.length; i < l; i++) {
var self = childs[i];
if (self.childNodes && self.childNodes.length) { // 子ノードがいる場合は再帰
arguments.callee(self);
}
if (self.nodeType !== 3) continue; // テキストノードでなければ次へ
var matchStack = [];
while (regRes = pattern.exec(self.textContent)) { // マッチがなくなるまでループしてスタック
matchStack.push({
"mUrl" : "http" + getPathname(regRes[0]),
"pStart" : regRes.index,
"pEnd" : pattern.lastIndex
});
}
while (matchStack.length >= 1) { // 後ろから1つずつ取り出して変更を適用
var item = matchStack.pop();
var a = document.createElement("a");
a.href = item.mUrl;
a.target = "_blank";
range.setStart(self, item.pStart);
range.setEnd(self, item.pEnd);
range.surroundContents(a);
}
}
})(document.body);
range.detach();
function getPathname(url){
var pattern = /:\/\//g;
if (pattern.exec(url)) {
return url.split(pattern.lastIndex);
}
return url;
}
})();
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。