`
sklst
  • 浏览: 38918 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

我的GreaseMonkey脚本

阅读更多
// ==UserScript==
// @name        google reader full feed changer
// @namespace   http://blog.fkoji.com/
// @include     http://www.google.*/reader/*
// @include     https://www.google.*/reader/*
// @version     0.71
// ==/UserScript==

var SITE_INFO = [
	{
        url:    'www.eeo.com.cn',
        xpath:  '(//div[@id="text_content"]|//div[@class="content link12hui"])',
    },
	{
        url:    'www.ftchinese.com',
        xpath:  '//div[@class="content"]',
    },
	{
        url:    'www.infoq.com',
        xpath:  '//div[@class="box-content-5"]',
    },
	{
        url:    'www.hbrchina.com',
        xpath:  '//div[@id="txtcontent"]',
        charset:   'gb2312'
    },
	{
        url:    'blog.sina.com.cn',
        xpath:  '//div[@id="articleBody"]',
    },
	{
        url:    'http://news.163.com',
        xpath:  '//div[@id="endText"]',
        charset:   'gb2312'
    }
/*
    {
        url: '',
        xpath: '',
        charset: ''
    }
*/
];
var AUTO_FETCH = false;
var SHOW_ENGLISH = false;
var DO_ONCE = true;
var ON_GET = false;
var FullFeed = {};
FullFeed.link = '';
FullFeed.getFocusedLink = function() {
    return getStringByXPath('//div[@id="current-entry"]//a[@class="entry-title-link"]/@href');
}
FullFeed.getCurrentEntry = function() {
    var link = this.getFocusedLink();
    this.link = link;
    var body = getFirstElementByXPath('//div[@id="current-entry"]//div[@class="entry-body"]');
    if (!body) {
        body= getFirstElementByXPath('//div[@id="current-entry"]//div[@class="entry-body entry-body-empty"]');
    }
    var source = '';
    if (location.href.match(/#stream\/user/)) {
        source = getStringByXPath('//div[@id="current-entry"]//a[@class="entry-source-title"]/@href');
    }
    else if (location.href.match(/#search\//)) {
        source = getStringByXPath('//div[@id="current-entry"]//a[@class="entry-source-title"]/@href');
    }
    else if (location.href.match(/#stream\/feed/)) {
        source = getStringByXPath('//span[@id="chrome-title"]//a/@href');
    }
    if (!source) {
        return false;
    }
    source = decodeURIComponent(source.replace(/^\/reader\/view\/feed\//, ''));
    var len = SITE_INFO.length;
    for (var i = 0; i < len; i++) {
        var reg = new RegExp(SITE_INFO[i].url);
        if (source.match(reg) || link.match(reg)) {
            this.request(i, link, body);
			lock();
            break;
        }
    }
};
FullFeed.request = function(i, link, body) {
    var mime = 'text/html; charset=';
    if (SITE_INFO[i].charset) {
        mime = mime + SITE_INFO[i].charset;
    } else {
        mime = mime + 'utf-8';
    }
    GM_xmlhttpRequest({method: "GET", url: link, overrideMimeType: mime, onload: function(r) {
        var text = r.responseText;
        text = text.replace(/(<[^>]*?)on(?:(?:un)?load|(?:db)?click|mouse(?:down|up|over|out|move)|key(?:press|down|up)|abort|blur|change|error|focus|re(?:size|set)|select|submit)\s*?=\s*?["'][^"']*?["']/ig, "$1");
		if (link.match('163'))
		{
			var comment = text.match('reply_setHidden.+;')[0];
			var carray = "var comments = new " + comment.replace('reply_setHidden','Array');
			eval(carray);
		}
        text = text.replace(/<\s*?script[^>]*?>[\s\S]*?<\s*?\/script\s*?>/ig, "");
        var htmldoc = createHTMLDocumentByString(text);
        var contents = getFirstElementByXPath(SITE_INFO[i].xpath, htmldoc);

        if (contents == null) return;

        while (body.firstChild && !SHOW_ENGLISH) {
            body.removeChild(body.firstChild);
        }
		if (link.match('ftchinese') && text.match('showenglish')) SHOW_ENGLISH = true;
        if (!contents.length) {
			if (SHOW_ENGLISH)
				body.insertBefore(addTargetAttr(relativeToAbsolute(contents, link)), body.firstChild);
			else
				body.appendChild(addTargetAttr(relativeToAbsolute(contents, link)));
			if (link.match('163')){
				var pElement = document.createElement("a");
				pElement.setAttribute("target","_blank");
				pElement.setAttribute("style","color:#ba2636;text-decoration:none;font-size:12px;");
				pElement.setAttribute("href","http://comment.news.163.com/"+comments[0]+"/"+comments[1]+".html");
				pElement.innerHTML="跟帖 "+comments[2]+" 条";
				var eElement = pElement.cloneNode(true);
				body.insertBefore(pElement, body.firstChild);
				body.appendChild(eElement);
			}
			if (r.status == 200 && SHOW_ENGLISH && DO_ONCE) {FullFeed.request(i, link+"&lang=en", body);DO_ONCE = false;}
            return;
        }
        // array
        for (var num = 0; num < contents.length; num++) {
            body.appendChild(addTargetAttr(relativeToAbsolute(contents[num], link)));
        }
    }, onreadystatechange: function(r){if (r.status != 200) ON_GET = false; else ON_GET = true;}});
};

function initial(){
	setTimeout(initial,2000);
	if (ON_GET)
	{
		DO_ONCE = true;
		SHOW_ENGLISH = false;
	}
}
function relativeToAbsolute(node, link) {
    var imgs = getElementsByXPath('//img', node);
    if (imgs.length) {
        for (var i = 0; i < imgs.length; i++) {
            var src = imgs[i].getAttribute('src');
            if (src) {
                imgs[i].setAttribute('src', toAbsolutePath(src, link));
            }
        }
    }
	var anchor = getElementsByXPath('//a', node);
    if (anchor.length) {
        for (var i = 0; i < anchor.length; i++) {
            var href = anchor[i].getAttribute('href');
            if (href) {
                anchor[i].setAttribute('href', toAbsolutePath(href, link));
            }
        }
    }
    return node;
}
function addTargetAttr(node) {
    var anchors = getElementsByXPath('//a', node);
    if (!anchors) {
        return false;
    }
    for (var i = 0; i < anchors.length; i++) {
        anchors[i].setAttribute('target', '_blank');
    }
    return node;
}
function createHTMLDocumentByString(str) {
    var html = str.replace(/<!DOCTYPE.*?>/, '').replace(/<html.*?>/, '').replace(/<\/html>.*/, '')
    var htmlDoc  = document.implementation.createDocument(null, 'html', null)
    var fragment = createDocumentFragmentByString(html)
    htmlDoc.documentElement.appendChild(htmlDoc.importNode(fragment, true))
    return htmlDoc
}
function createDocumentFragmentByString(str) {
    var range = document.createRange()
    range.setStartAfter(document.body)
    return range.createContextualFragment(str)
}
function getStringByXPath(xpath, node) {
    var node = node || document
    var doc = node.ownerDocument ? node.ownerDocument : node
    var str = doc.evaluate(xpath, node, null,
        XPathResult.STRING_TYPE, null)
    return (str.stringValue) ? str.stringValue : ''
}
function getElementsByXPath(xpath, node) {
    var node = node || document
    var doc = node.ownerDocument ? node.ownerDocument : node
    var nodesSnapshot = doc.evaluate(xpath, node, null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
    var data = []
    for (var i = 0; i < nodesSnapshot.snapshotLength; i++) {
        data.push(nodesSnapshot.snapshotItem(i))
    }
    return (data.length >= 1) ? data : null
}
function getFirstElementByXPath(xpath, node) {
    var node = node || document
    var doc = node.ownerDocument ? node.ownerDocument : node
    var result = doc.evaluate(xpath, node, null,
        XPathResult.FIRST_ORDERED_NODE_TYPE, null)
    return result.singleNodeValue ? result.singleNodeValue : null
}
function toAbsolutePath(url, base) {
    // absolute path
    if (url.match(/^https?:\/\//)) {
        return url;
    }

    var head = base.match(/^https?:\/\/[^\/]+\//)[0];
    if (url.indexOf('/') == 0) {
        return head + url;
    }

    var basedir = base.replace(/\/[^\/]+$/, '/');
    if (url.indexOf('.') == 0) {
        while (url.indexOf('.') == 0) {
            if (url.substr(0, 3) == '../') {
                basedir = basedir.replace(/\/[^\/]+\/$/, '/');
            }
            url = url.replace(/^\.+\//, '');
        }
    }
    return basedir + url;
}
function getPageFromURL(url){
	return url.replace(/^https?:\/\/[^\/].+\//, '');
}

if (AUTO_FETCH) {
    var interval = window.setInterval(
        function() {
            var focusedLink = FullFeed.getFocusedLink();
            if (focusedLink != FullFeed.link) {
                FullFeed.getCurrentEntry();
            }
        },
        500
    );
}

document.addEventListener(
    'keydown',
    function(event) {
        var key = String.fromCharCode(event.keyCode);
        if (key.toLowerCase() == 'z') {
            FullFeed.getCurrentEntry();
        }
    },
    false
);

document.addEventListener(
    'keydown',
    function(event) {
        var key = String.fromCharCode(event.keyCode);
		var name = "chrome-lhn-toggle";
        if (key.toLowerCase() == 'q') {
			var evt = document.createEvent("MouseEvents");
			evt.initEvent("click", true, true);
			document.getElementById(name).dispatchEvent(evt);
        }
    },
    false
);

document.addEventListener(
    'keydown',
    function(event) {
        var key = String.fromCharCode(event.keyCode);
		var name = "show-new";
		var showNew = document.getElementById("show-new");
		var showAll = document.getElementById("show-all");
        if (key.toLowerCase() == 'w') {
			var evt = document.createEvent("MouseEvents");
			evt.initEvent("click", true, true);
			if (showNew.className=="unselectable link"){
				showNew.dispatchEvent(evt);
			}else{
				showAll.dispatchEvent(evt);
			}
			
        }
    },
    false
);

initial();



网易新闻显示评论条数和链接(无评论,不新闻)
FTChinese文章显示中英对照(FT的英文还是比较native的)
分享到:
评论

相关推荐

    Firefox用户脚本管理器(Greasemonkey) v1.10火狐插件.rar

    随着Greasemonkey脚本常驻于浏览器,每次随着目的网页打开而自动做修改,使得运行脚本的用户印象深刻地享受其固定便利性。 技术明细: 大部分Greasemonkey用户脚本都是自行撰写,使用对某网站专用的JavaScript代码...

    greasemonkey:个人 Greasemonkey 脚本

    标题中的“个人Greasemonkey脚本”表明这是一个用户自定义的脚本集合,可能包含了针对特定网站或功能的个性化增强。 在描述中,“莎拉的Greasemonkey脚本”指的是这个脚本库是由一位名叫莎拉的开发者创建的,并且...

    Chrome最新4.0版本支持GreaseMonkey脚本

    Chrome浏览器的4.0版本引入了一个重大更新,即对GreaseMonkey脚本的支持。这是一个对开发者和用户都极具价值的功能,因为GreaseMonkey脚本允许用户自定义网页的行为,为浏览器带来更多的定制化可能性。在此之前,...

    深入浅出Greasemonkey,油猴脚本入门

    深入浅出Greasemonkey,油猴脚本入门 Greasemonkey 是一个 Firefox 扩展,它具有通过编写脚本来改变被访问网页的功能。使用它,能使您访问的网站更便于阅读或者更便于使用。使用它,您能修复网页渲染的缺陷,而无须...

    greaseMonkey

    2. **@Metadata**:每个GreaseMonkey脚本的开头通常包含一些元数据(@metadata),例如`@name`定义脚本的名称,`@namespace`用于组织脚本,`@description`提供脚本的简短说明,`@include`和`@exclude`则分别指定脚本...

    红晋江目录页高亮显示近期更新greasemonkey脚本

    HJJ目录页突出最近发布帖子的脚本,用于Firefox的greasemonkey扩展

    gm_scripts:firefox的Greasemonkey脚本

    标题 "gm_scripts:firefox的Greasemonkey脚本" 指向的是一个与Firefox浏览器相关的项目,特别涉及到了Greasemonkey脚本的使用。Greasemonkey是Firefox的一个非常流行的用户脚本管理扩展,它允许用户通过JavaScript来...

    用Greasemonkey 脚本收藏网站会员信息到本地

    【Greasemonkey脚本简介】 Greasemonkey是一款适用于Firefox浏览器的用户脚本管理扩展,它允许用户自定义网页的行为,通过编写JavaScript代码来修改网页内容、添加功能或者优化用户体验。Greasemonkey脚本可以在特定...

    Swedbank-Greasemonkey:用于更改登录选项的 Greasemonkey 脚本

    Swedbank-Greasemonkey 是一个专门为Swedbank银行用户设计的Greasemonkey脚本。Greasemonkey是一款流行的浏览器扩展,主要应用于Firefox,它允许用户通过自定义的JavaScript脚本来修改网页的HTML和CSS,从而改变网页...

    深入浅出Greasemonkey.pdf

    用户脚本由JavaScript代码和一些元数据组成,它们告诉Greasemonkey脚本应当在何时、何地运行。这些脚本可以针对单一页面、一组页面或者整个网站。安装用户脚本后,就可以在不需要任何服务器支持的情况下改变网页的...

    dziekanat-agh:Greasemonkey 脚本,让院长办公室更愉快的操作

    【标题】"dziekanat-agh: 使用Greasemonkey脚本提升院长办公室操作体验" 在IT领域,Greasemonkey是一款强大的浏览器扩展,它允许用户通过编写JavaScript脚本来自定义网页的行为,从而增强对特定网站的功能和交互。...

    rt_gmonkey:Greasemonkey 脚本允许您在 RT 中键入命令

    `rt_gmonkey` 是专门为RT设计的一个Greasemonkey脚本,其目的是扩展RT的交互功能,让用户在RT界面中可以直接输入命令,提升工作效率。 **Greasemonkey 脚本的工作原理** Greasemonkey脚本是基于JavaScript编写的,...

    深入Greasemonkey

    每个Greasemonkey脚本都包含一个metadata部分,用于定义脚本的元信息,如名称、版本和运行的网页URL。然后是脚本主体,编写JavaScript代码来实现预期功能。安装脚本通常只需在Firefox中导入脚本文件(.user.js),...

    hwz:用于forums.hardwarezone.com.sg 的GreaseMonkey 脚本

    4. **用户脚本开发**: 开发GreaseMonkey脚本需要了解如何编写JavaScript代码,以及如何利用GM API(GreaseMonkey API)来访问和修改网页内容。开发者需要具备一定的HTML和CSS知识,以便理解网页结构并进行有效操作。...

    gm-scripts:Greasemonkey 脚本的存储库

    Greasemonkey 脚本的存储库。 脚本 Xdr Imdb 重定向器 将任何 imdb 页面重定向到没有 url 参数的版本(在 ? 之后的那些)。 Xdr Steam 重定向器 将任何 Steam 页面(从store.steampowered.com和steamcommunity.com ...

    nytimes-greasemonkey:一个用于禁用左右箭头键以跳过 NYTimes.com 上的文章的 Greasemonkey 脚本

    《使用Greasemonkey脚本禁用NYTimes.com文章中的左右箭头键》 在互联网浏览体验中,个性化和自定义已经成为许多用户追求的目标。针对纽约时报(NYTimes.com)网站阅读文章时遇到的左右箭头键跳转问题,开发者创造了...

    AutoSkipper:自动跳过身份验证屏幕的 Greasemonkey 脚本

    自动跳过身份验证屏幕的 Greasemonkey 脚本 作者:@akatubame / 日期:2015/02/15 / 版本:0.1.0 / 语言:Javascript( ) ## ■ 此工具的说明 这是一个扩展脚本,可自动跳过浏览器中的重定向和年龄验证等确认屏幕...

    greasehamster:Greasemonkey 脚本

    油仓鼠一小部分 Greasemonkey 脚本jstorproxy - 重写 JSTOR 和其他包含期刊文章的站点的 URL 以使用代理,通常由学术机构提供。 见 apex-highlighter - 使用 Alex Gorbatchev 的 SyntaxHighlighter 突出显示 ...

    greasemonkey-galch:我用来禁用 .RU 中的所有互联网垃圾的 Greasemonkey 脚本

    油脂猴子-galch 我用来禁用 .RU 中的所有互联网垃圾的 Greasemonkey 脚本

Global site tag (gtag.js) - Google Analytics