iframe2link
by
noromanba
2016-02-29 [2016/02/29 06:20:18]
replace iframe to anchor link
@@ -15,8 +15,10 @@
'[src^="http://www.facebook.com/"]',
// #twitter-widget-* .twitter-share-button .twitter-tweet-button
'[class|="twitter"]',
+ '[src^="//platform.twitter.com/widgets/"]',
'[src^="https://apis.google.com/"]',
'[src^="https://embed.tumblr.com/widgets/share/button"]',
+ '[src^="https://widgets.getpocket.com/"]'
].map(sel => ':not(' + sel + ')').join('');
const replace = (ctx) => {
/*
* @title iframe2link
* @description replace iframe to anchor link
* @include http://example.com/DIY/*
* @license MIT http://opensource.org/licenses/MIT
* @javascript_url
*/
// UserScript
// https://gist.github.com/noromanba/26d1804fac23f76d9dfc
(() => {
const whitelist = [
'[src^="javascript:"]',
'[src^="http://www.facebook.com/"]',
// #twitter-widget-* .twitter-share-button .twitter-tweet-button
'[class|="twitter"]',
'[src^="//platform.twitter.com/widgets/"]',
'[src^="https://apis.google.com/"]',
'[src^="https://embed.tumblr.com/widgets/share/button"]',
'[src^="https://widgets.getpocket.com/"]'
].map(sel => ':not(' + sel + ')').join('');
const replace = (ctx) => {
if (ctx.tagName.toLowerCase() === 'iframe') {
ctx = ctx.parentNode || document.body;
}
Array.from(ctx.querySelectorAll('iframe[src]' + whitelist)).forEach(iframe => {
const link = document.createElement('a');
link.href = iframe.src;
link.appendChild(document.createTextNode(link.href));
iframe.parentNode.replaceChild(link, iframe);
});
};
replace(document.body);
new MutationObserver(records => {
records.forEach(record => {
const ctx = record.target;
if (!ctx.tagName || !ctx.querySelectorAll) return;
replace(ctx);
});
}).observe(document.body, { childList: true, subtree: true });
})();
- Permalink
- このページへの個別リンクです。
- RAW
- 書かれたコードへの直接のリンクです。
- Packed
- 文字列が圧縮された書かれたコードへのリンクです。
- Userscript
- Greasemonkey 等で利用する場合の .user.js へのリンクです。
- Loader
- @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
- Metadata
- コード中にコメントで @xxx と書かれたメタデータの JSON です。