My New GreaseMonkey Script

// ==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");
var show163 = true;
if (link.match('163'))
{
var comment = text.match('var end_board.+;');
if (comment == null)
{
show163 = false;
} else {
eval(comment[0]);
var comments = new Array(end_board, end_thread, end_count);
}
// alert(comments.length);
// 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') && show163){
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();
通过使用少量的JavaScript脚本,自定义网页显示方式或表现方式。Greasemonkey是Mozilla Firefox的一个附加组件。它让用户安装一些脚本使大部分HTML为主的网页于用户端直接改变得更方便易用。随着Greasemonkey脚本常驻于浏览器,每次随着目的网页打开而自动做修改,使得运行脚本的用户印象深刻地享受其固定便利性。 技术明细: 大部分Greasemonkey用户脚本都是自行撰写,使用对某网站专用的JavaScript代码,通过文档对象模型(DOM)接口对网页内容做操作。userscripts.org维护了个Greasemonkey数据库。该数据库描述哪个网址网页对应到哪个脚本。当用户加载匹配的网页,Greasemonkey便调用相关的脚本,而该脚本便根据脚本内容改变网页的内容。Greasemonkey脚本亦能通过非网域绑定的XMLHTTP要求来查询外部HTTP资源。Greasemonkey亦遵循某用户名.user.js的格式,这让当该特定用户拜访时Greasemonkey可自动侦测并提供安装选项。除了JavaScript代码,Greasemonkey脚本包括有限可选用后数据集。该后数据集描述了脚本名称、脚本描述、网址用来区分同名脚本的地址空间、以及原本该脚本为哪些网址撰写的列表。Greasefire扩展:同Greasemonkey扩展配合使用,自动显示在userscripts.org的脚本库中是否存在可以在当前正在浏览网站上使用的脚本,如果存在Greasemonkey的猴头图标背景就会变为彩色的。右键点击猴头图标,最上面一行就是打开当前网站可用脚本列表的选项。Platypus(platypus.mozdev.org)附加组件可让用户可以编辑网页(删除或者移动某碍眼的部分)。Platypus随后将结果存成常驻的Greasemonkey脚本。 典型的脚本: 用户群已发展大量的脚本,以下是其中的一些应用:调整Gmail让Google Reader内嵌,因而提供RSS新闻订阅的选项。当联机浏览某本书时同时显示对手网站同本书价钱。去除来自某些站的广告,包括弹出视窗与Google文字广告。改变网页的版面,包括原本该网页作者未考虑到的元素大小与浏览器画面大小。自动完成窗体。浏览某些布告栏网站自动过滤特定的发帖人。增删网页上的某些功能。让用户从某些视频站点如Google Video以及YouTube存下FLV视频文件。从现行网页找寻任何RSS新闻订阅,并将它们显示在可扩展、漂浮于网页上的皮肤里。突破百度贴吧对言论内容的管制,辅助发表繁体汉字及不受贴吧服务器支持的字符,或者将文字转换为图片发表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值