リンク化
by
htsign
2016-10-09 [2016/10/09 02:11:46]
httpやttpやtpなリンクのないURLにリンクを付ける(どこにでもあるやつだけど、標準技術のみで実装している自己満足ver)
@@ -7,30 +7,30 @@
// 【直近の変更】
-// ・NodeIteratorを使ってコード内の探査を簡略化
-// ・旧IEの考慮を排除
+// ・ちょっとリファクタ
+// ・正規表現を少し変更
(function(){
var filter = function(node) {
- var isAnchor = node.parentNode && node.parentNode.nodeName.toLowerCase() === "a";
+ var isAnchor = node.parentNode && node.parentNode.nodeName === "A";
return isAnchor ? NodeFilter.FILTER_SKIP : NodeFilter.FILTER_ACCEPT;
};
var iter = document.createNodeIterator(document.body, NodeFilter.SHOW_TEXT, filter, false), current;
var range = document.createRange();
- 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 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;
while (current = iter.nextNode()) {
var regRes, matchStack = [];
while (regRes = pattern.exec(current.data)) { // マッチがなくなるまでループしてスタック
matchStack.push({
- "mUrl" : "http://" + getPathname(regRes[0]),
- "pStart" : regRes.index,
- "pEnd" : pattern.lastIndex
+ mUrl : "http://" + getPathname(regRes[0]),
+ pStart : regRes.index,
+ pEnd : pattern.lastIndex,
});
}
- while (matchStack.length >= 1) { // 後ろから1つずつ取り出して変更を適用
+ while (matchStack.length > 0) { // 後ろから1つずつ取り出して変更を適用
var item = matchStack.pop();
var a = createAnchor(item.mUrl);
@@ -41,12 +41,9 @@
}
range.detach();
- function getPathname(url){
+ function getPathname(url) {
var pattern = /:\/\//g;
- if (pattern.exec(url)) {
- return url.slice(pattern.lastIndex);
- }
- return url;
+ return pattern.exec(url) ? url.slice(pattern.lastIndex) : url;
}
function createAnchor(url) {
var a = document.createElement("a");
/*
* @title リンク化
* @description httpやttpやtpなリンクのないURLにリンクを付ける(どこにでもあるやつだけど、標準技術のみで実装している自己満足ver)
* @include http://*
* @license MIT License
*/
// 【直近の変更】
// ・ちょっとリファクタ
// ・正規表現を少し変更
(function(){
var filter = function(node) {
var isAnchor = node.parentNode && node.parentNode.nodeName === "A";
return isAnchor ? NodeFilter.FILTER_SKIP : NodeFilter.FILTER_ACCEPT;
};
var iter = document.createNodeIterator(document.body, NodeFilter.SHOW_TEXT, filter, false), current;
var range = document.createRange();
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;
while (current = iter.nextNode()) {
var regRes, matchStack = [];
while (regRes = pattern.exec(current.data)) { // マッチがなくなるまでループしてスタック
matchStack.push({
mUrl : "http://" + getPathname(regRes[0]),
pStart : regRes.index,
pEnd : pattern.lastIndex,
});
}
while (matchStack.length > 0) { // 後ろから1つずつ取り出して変更を適用
var item = matchStack.pop();
var a = createAnchor(item.mUrl);
range.setStart (current, item.pStart);
range.setEnd (current, item.pEnd );
range.surroundContents(a);
}
}
range.detach();
function getPathname(url) {
var pattern = /:\/\//g;
return pattern.exec(url) ? url.slice(pattern.lastIndex) : url;
}
function createAnchor(url) {
var a = document.createElement("a");
a.href = url;
a.target = "_blank";
return a;
}
})();
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。