Skip to content

Instantly share code, notes, and snippets.

@Constellation
Created December 18, 2008 00:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Constellation/37309 to your computer and use it in GitHub Desktop.
Save Constellation/37309 to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name LDR Pin Feed
// @namespace http://d.hatena.ne.jp/Constellation/
// @description show pin items as feed
// @author Constellation
// @include http://fastladder.com/reader/*
// @include http://reader.livedoor.com/reader/*
// ==/UserScript==
(function(win){
//Configuration
location.href = 'javascript:(' + function() {
var KEY = 'P';
var base = {
ads: null,
gm: true,
subscribe_id: "gm_pinned_items",
last_stored_on: "",
channel:{
error_count: "0",
link: location.href,
description: "my pinned items",
image: "/img/icon/pin.gif",
title: "Pinned items",
feedlink: "/api/pin/all",
subscribers_count: "1",
expires: (new Date).getTime()/1000,
},
items: []
}
function format(pin){
base.items = pin.pins.map(function(pin, index){
return {
"enclosure":"",
"link": pin.url,
"enclosure_type":null,
"author":"",
"body": "",
"created_on": pin.created_on,
"modified_on": "",
"id": index+0.1234567,//小数ならかぶらない+ボタンも有効になる
"title": pin.title,
"category":null
}
});
return base
}
function GM_main(){
gm_print_feed(format(pin));
}
//ほぼprint_feedから持ってくるが, pin描画に適応
var before_reading = "";
function gm_print_feed(feed){
invoke_hook('BEFORE_PRINTFEED', feed);
var subscribe_id = feed.subscribe_id;
State.last_feed = feed;
State.last_items = {};
State.requested = false;
before_reading = State.now_reading;
State.now_reading = subscribe_id;
var Now = (new Date - 0)/1000;
var output = $(print_feed.target);
var channel = feed.channel;
var items = feed.items;
var item_formatter = new ItemFormatter().compile();
var feed_formatter = new FeedFormatter().compile();
var item_count = 0;
var item_f = function(v){
item_count++;
State.last_items["_"+v.id] = v;
var widgets = entry_widgets.process(feed, v);
return item_formatter(v,{
relative_date : (v.created_on) ? (Now-v.created_on).toRelativeDate() : tl('Unknown date'),
item_count : item_count,
widgets : widgets,
pin_active : pin.has(v.link) ? "pin_active" : "",
pinned : pin.has(v.link) ? "pinned" : "",
loop_context : [
(item_count == 1) ? "first" : "",
(item_count % 2) ? "odd" : "even",
(item_count == size) ? "last" : "",
(item_count != 1 && item_count != size) ? "inner" : ""
].join(" ")
});
};
var subscribe_info = subs_item(subscribe_id, feed);
var size = items.length;
var first_write_num = LDR_VARS.PrintFeedFirstNum;
var widgets = channel_widgets.process(feed, items);
output.innerHTML = feed_formatter(
feed, channel, subscribe_info, {
ads_expire : null,
widgets: widgets,
items : function(){
return items.slice(0, first_write_num).map(item_f).join("")
}
}
);
fix_linktarget();
State.writer && State.writer.cancel();
State.writer2 && State.writer2.cancel();
function DIV(text){
var div = document.createElement("div");
div.innerHTML = text;
fix_linktarget(div);
return div;
}
// 遅延描画
function push_item(){
var num = LDR_VARS.PrintFeedNum;
var delay = LDR_VARS.PrintFeedDelay;
var delay2 = LDR_VARS.PrintFeedDelay2;
var writer = function(){
var remain_items = items.slice(writed,writed + num).map(item_f).join("");
writed += num
if(more.className){
more.className = "hide";
more.innerHTML = "";
}
State.writer2 = (function(){
more.appendChild(DIV(remain_items))
more.className = "";
}).later(10)();
if(writed < size){
State.writer = writer.later(delay2)();
}
};
State.writer = writer.later(delay)();
}
if(items.length > first_write_num){
var more = $N("div",{"class":"more"});
more.innerHTML = "描画中";
output.appendChild(more);
var writed = first_write_num;
push_item();
}
Control.scroll_top();
Control.del_scroll_padding();
print_feed.target = "right_body";
invoke_hook('AFTER_PRINTFEED', feed);
}
var id = setTimeout(function(){
id && clearTimeout(id);
if(typeof Keybind != 'undefined' && get_next && get_prev){
// native 書き換え.
var get_next_orig = get_next;
get_next = function(){
if(State.now_reading == 'gm_pinned_items'){
State.now_reading = before_reading;
}
return get_next_orig();
}
var get_prev_orig = get_prev;
get_prev = function(){
if(State.now_reading == 'gm_pinned_items'){
State.now_reading = before_reading;
}
return get_prev_orig();
}
Keybind.add(KEY, GM_main)
} else {
id = setTimeout(arguments.callee, 100);
}
}, 0);
}.toString() + ')()';
})(this.unsafeWindow || this);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment