EntryDiff

  • /*
     * @title EntryDiff
     * @description オープンソースの社内SNS「SKIP」に前回閲覧時からの差分を表示する機能を追加します。FirefoxのGreasemonkeyでのみ動作する為、Bookmarkletとしては使用できません。画面下部のUserScriptからインストールして使用してください。
     * @include http://*?entry_id=*
     * @license MIT License
     * @require 
     */
    (function() {
    var entryId = location.href.match(/entry_id=([0-9]+)/)[1];
    var prevVisit = parseInt(GM_getValue(entryId)) || new Date().getTime() - 365 * 24 * 3600 * 1000;
    
    var targets = new Array();
    
    var list = document.getElementsByClassName("date")
    for(var i = 0; i < list.length; i++) {
    	var dateString = list[i].textContent.replace("年", "/").replace("月", "/").replace("日", "")
    	var date = new Date(dateString.match(/[0-9]{4}\/[0-9]{2}\/[0-9]{2} [0-9]{2}:[0-9]{2}/) + ":00").getTime()
    	if(isNaN(date)) {
    		var date = new Date(dateString.split('\n')[2].match(/(.*) by /)[1] + ":00").getTime()
    	}
    	
    	if(date > prevVisit) {
    		var target = {element: list[i], isComment: null};
    		target.isComment = (target.element.tagName == "SPAN");
    		targets.push(target);
    	}
    }
    GM_setValue(entryId, new Date().getTime().toString());
    
    var boxElement = document.createElement("DIV");
    boxElement.innerHTML = getBoxHTML();
    boxElement.id = "historyBox";
    
    for(var i = 0; i < targets.length; i++) {
    	var linkText = "";
    	//	着色, タイトル取得
    	if(targets[i].isComment) {
    		targets[i].element.parentNode.parentNode.parentNode.style.backgroundColor = "#FFBBBB";
    		linkText = targets[i].element.parentNode.textContent.match(/ *(.*?)\s*\[/)[1];
    	} else {
    		targets[i].element.parentNode.style.backgroundColor = "#FFBBBB";
    		targets[i].element.parentNode.parentNode.style.backgroundColor = "#FFBBBB";
    		linkText = targets[i].element.textContent.match(/ by (.*?)\s*\[/)[1];
    	}
    
    	//	ラベルの作成
    	var labelNode = document.createElement("A");
    	labelNode.name = "history" + i;
    	targets[i].element.parentNode.insertBefore(labelNode, targets[i].element);
    	
    	//	一覧リストの作成
    	var liNode = document.createElement("LI");
    	var aNode = document.createElement("A");
    	aNode.textContent = linkText;
    	aNode.href = "#history" + i;
    	liNode.appendChild(aNode);
    	boxElement.getElementsByTagName("ul")[0].appendChild(liNode);
    }
    
    document.getElementById("contents_left").getElementsByTagName("form")[0].insertBefore(boxElement, document.getElementsByClassName("box_space")[0]);
    
    function getBoxHTML() {
    	var html = "";
    	html += '<div class="box_space">\n';
    	html += '  <div class="box_space_title">変更点の一覧</div>\n';
    	html += '  <div style="font-size: 10px;" class="box_space_body">\n';
    	html += '    <ul style="list-style-position: inside; list-style-type: disc;">\n';
    	html += '    </ul>\n';
    	html += '    <br style="display: none; clear: left;"/>\n';
    	html += '  </div>\n';
    	html += '</div>\n';
    	return html;
    }
    })();
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2010/09/01 16:56:30 - 2010-09-01
  2. 2010/08/20 09:57:16 - 2010-08-20
  3. 2010/08/16 22:12:12 - 2010-08-16
  4. 2010/08/16 22:10:55 - 2010-08-16
  5. 2010/08/16 22:10:32 - 2010-08-16