NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name memo-kick for DVDPRIME // @namespace http://www.tobyto.pe.kr // @grant none // @description Kick Memo // @copyright 2009+, lum34 // @licence GPL licence // @version 0.03 // @homepage http://www.tobyto.pe.kr // @include http://dvdprime.donga.com/note/* // @enable true // ==/UserScript== (function() { /* memo-kick for DVDPRIME version0.02 * 이 스크립트는 DVDPRIME의 쪽지 기능을 보완하기 * 위한 스크립트입니다. * http://dczzb.daz.kr/ 프갤의 땡칠도사님의 찌질반 스크립트와 * alba-kick for DVDPRIME을 참조하여 만들어졌습니다. * * 프겔의 땡칠도사님께 감사드립니다. (- -) (_ _) (- -) * * 본 스크립트는 GPL에 따라 누구나 자유롭게 사용하고 배포 및 수정할 수 있습니다. * GPL원문: http://www.fsf.org/licensing/licenses/gpl.html */ /* ########## 설정 ########## */ function setConfig() { Config = { /* 일반 문자열 혹은 자바스크립트용 정규표현식을 사용할 수 있습니다. 각 항목에 해당하는 내용을 괄호안에 쓰시면 됩니다. ex) ID: ["일반문자열", /정규표현식/i, "자동인식"], ... ID : 사용자 ID입니다. 게시판 목록에서 소스 보기를 하시면 아래와 같은 항목을 찾으실 수 있습니다. 아이디라고 표시된 부분이 DP 아이디 이고 Nickename이 Nickename입니다. <p onclick="javascript:id_show_menu('아이디','',event);return false" style="cursor:pointer;">닉네임</p> 닉네임에 특수문자나 HTML이 들어있는 경우 차단이 안될 수도 있습니다. 이때는 아이디를 넣어주시면 차단이 됩니다. HTML이 들어 있는 닉네임인 경우 HTML 부분을 대문자로 하시면 차단이 될 수도 있습니다. */ ID: [], /* 다음 목록에 있는 단어가 제목이나 댓글에 들어있으면 해당글을 차단합니다. */ Words: [], /* 다음 목록의 사용자들은 차단에서 제외합니다. */ WhiteID: [], /* - 부가적인 기능을 선택할 수 있습니다. 사용 방법은 차단 아이디/닉네임 입력 방법과 비슷합니다. ex) Dpoptions: [ShowFiltered], Dpoptions: [ShowFiltered, HighlightWhites], 아무런 흔적을 남기고 싶지 않다면 Dpoptions: [], 와 같이 하시면 됩니다. 현재 사용 가능한 기능은 다음과 같습니다: * ShowFiltered : 차단된 흔적을 남깁니다. * HighlightWhites : 화이트리스트에 있는 유저를 강조합니다. */ Dpoptions: [ShowFiltered, HighlightWhites], /* - 사용할 필터를 설정합니다. 스크립트에 대한 이해 없이는 건드리지 않는 것이 좋습니다. */ MemoFilters: [isWhiteUser, isBannedUser, isBannedWord] };} /******************************************************************************/ /* 스크립트 시작. /******************************************************************************/ function content (type, text, id, object) {this.type=type; this.text=text; this.id=id; this.object=object;} function filter (f, action) {this.f=f;this.action=action;} /******************************************************************************/ /* 필터 정의 * * myFilter = new filter ( * boolean function (content) f, * void function (content) action * ); * * 'f'가 true를 반환하면, 'action' 이 수행된다. * 두 함수는 content 1개의 파라미터만을 가진다. */ isWhiteUser = new filter ( function(c) { return (array_has (Config.WhiteID, c.id)); }, function(c) {} ); isBannedUser = new filter ( function(c) { return (array_has(Config.ID, c.id)); }, function(c) { deleteContent(c); } ); isBannedWord = new filter ( function(c) { if (array_filter (Config.Words, cmpf(c.text)).length == 0) return false; return true; }, function(c) { deleteContent (c); } ); /******************************************************************************/ /* 옵션 정의 */ function ShowFiltered() { flush_delbuf = function () { array_map( delbuf, function(c) { var o = c.object; var delIdx = o.rowIndex; o.parentNode.rows[delIdx+1].cells[1].innerHTML = "해당 쪽지는 차단되었습니다."; o.parentNode.rows[delIdx+1].cells[1].style.textDecoration = "line-through"; o.cells[1].innerHTML = "알바안녕"; o.cells[1].style.fontWeight = "bold"; } ); delete delbuf; delbuf = new Array(); }; } function HighlightWhites() { isWhiteUser.action = function (c) { var o = c.object; o.cells[1].style.background = "#98fb98"; } } /******************************************************************************/ /* 필터 */ /* 삭제될 부분이 저장되는 필터 정의*/ var delbuf = new Array(); /* 'delbuf'에 삭제될 부분 저장 */ function deleteContent(c) { delbuf.push(c); } /* 배열 'arr'에 함수 'f' 적용 */ function array_map(arr, f) { for (var i = 0, j = arr.length; i < j; i++) arr[i] = f(arr[i]); return arr; } /* 필터 'f'를 배역 'arr'에 적용하여 결과값 돌려줌.. * 결과값이 false 이면, 배열에서 제거 */ function array_filter(arr, f) { var newlist = new Array(); for (var i = 0, j = arr.length; i < j; i++) if (f (arr[i])) newlist.push(arr[i]); return newlist; } /* 배열값이 존재하는지 체크 */ function array_has(arr, obj) { if( array_filter (arr, cmpf_equal(obj)).length > 0 ) return true; return false; } /* 문자열 및 정규표현식 비교함수 */ function cmpf(str) { return function(word) { if (word.constructor.prototype === String.prototype) { if (str.indexOf(word) >= 0) return true; } else if (word.constructor.prototype === RegExp.prototype) { if (str.search(word) >= 0) return true; } return false; } } /* 비교함수 */ function cmpf_equal(str) { return function(word) { if (word.constructor.prototype === String.prototype) { if (str.length == word.length && str.indexOf(word) == 0) return true; } else if (word.constructor.prototype === RegExp.prototype) { if (str.replace(word, "").length == 0) return true; } return false; } } /* 트리밍 함수 */ function trim(str) { return str.replace(/^\s\s*/, "").replace(/\s\s*$/, ""); } /******************************************************************************/ /* 쪽지 관련 체크함수 */ /* 쪽지인지 체크 */ function is_Memo() { if(document.getElementsByName("frmNew")) return true; else false; } /* 메모 리스트인지 체크*/ function is_inMemoList(obj) { if (!obj || typeof( obj.innerHTML ) == "undefined") return false; if (obj.className == "bn") return true; } /******************************************************************************/ /* 게시판 분석 함수 */ function get_ID (id) { var id = trim(id.innerHTML); return id; } function to_Memo(td) { var MemoIdx = td.parentNode.rowIndex var text = td.parentNode.parentNode.rows[MemoIdx+1].cells[1].innerHTML; return new content ( "m", text, get_ID(td), td.parentNode); } /******************************************************************************/ /* 쪽지 리스트 가져오기 */ function getMemoList() { var writer = document.getElementsByTagName("TD"); return array_map(array_filter(writer, is_inMemoList), to_Memo); } /******************************************************************************/ /* 'delbuf'의 내용 삭제 */ function flush_delbuf(){ array_map ( delbuf, function(c) { var par = c.object.parentNode; var delIdx = c.object.rowIndex; for(var i=0; i<4; i++) par.deleteRow(delIdx); } ); delete delbuf; delbuf = new Array(); } /* 사용자 필터 적용 */ function applyFilters(list, filters) { for (var i = 0, j = list.length; i < j; i++){ for (var k = 0, l = filters.length; k < l; k++) { if (filters[k].f (list[i])) { filters[k].action (list[i]); break; } } } } /* 쪽지에 사용자 필터를 적용하여 내용삭제 */ function clearMemo() { applyFilters(getMemoList(), Config.MemoFilters); flush_delbuf(); } var Config; setConfig(); Config.Done = false; (function () { var i; for (var i = 0, j = Config.Dpoptions.length; i < j; i++) (Config.Dpoptions[i])(); })(); dpkickmain = function () { /* IETOY는 실행 시점을 보장못하므로 페이지가 완전히 로딩될때까지 기다린다.*/ if (Config.Done) return; /* 웹페이지가 로딩되었는지 체크 */ if (document.getElementsByName("frmNew")) { /* 쪽지 인지 체크한후 필터 적용 */ if(is_Memo()) { clearMemo(); } } } dpkickmain(); })();