tb_borer

tba_style

当前为 2014-07-13 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name tb_borer
  3. // @namespace http://wp.stf.iaceob.name
  4. // @description tba_style
  5. // @include http://tieba.baidu.com/*
  6. // @version 1
  7. // @grant none
  8. // @author 生物烯丙菊
  9. // ==/UserScript==
  10.  
  11. String.prototype.format = function () {
  12. var txt = this.toString();
  13. for (var i = 0; i < arguments.length; i++) {
  14. var exp = getStringFormatPlaceHolderRegEx(i);
  15. txt = txt.replace(exp, (arguments[i] == null ? "" : arguments[i]));
  16. }
  17. return cleanStringFormatResult(txt);
  18. }
  19. function getStringFormatPlaceHolderRegEx(placeHolderIndex) {
  20. return new RegExp('({)?\\{' + placeHolderIndex + '\\}(?!})', 'gm');
  21. }
  22. function cleanStringFormatResult(txt) {
  23. if (txt == null) return "";
  24. return txt.replace(getStringFormatPlaceHolderRegEx("\\d+"), "");
  25. }
  26.  
  27.  
  28.  
  29. !(function(window, $, undefined){
  30. var topic = $('#thread_topic');
  31. var h_posts = $('#thread_list li.j_thread_list');
  32. var h_paging = $('#frs_list_pager');
  33. var me = $('#balv_mod');
  34. var html = '';
  35.  
  36. var document = window.document;
  37. var pd = window.PageData;
  38. var tpl = {};
  39. var post_config = {
  40. forum_id: '',
  41. forum_name: '',
  42. tbs: ''
  43. };
  44.  
  45. tpl.html_header = '<header id="header" class="loop-12"></header>';
  46. tpl.html_container = '<div class="span container">{0}</div>';
  47. tpl.html_footer = '<footer id="footer" class="loop-12">Footer</footer>';
  48. tpl.html_box_posts = '<div class="loop-4 box_posts" id="box_posts"></div>';
  49. tpl.html_box_post = '<div class="loop-8 post_container" id="post_container"></div>';
  50. tpl.css = 'http://idc.iaceob.name/tba_style/tba_v1.css';
  51.  
  52. if (location.href === 'http://tieba.baidu.com/') {
  53. return;
  54. }
  55.  
  56. if (!pd) {
  57. return;
  58. }
  59.  
  60. function initBorer() {
  61. if (!!pd.forum.id) {
  62. var postsPage = parsePosts($('body'));
  63. initPage();
  64. initPosts(postsPage);
  65. return;
  66. }
  67. if (!!pd.forum.forum_id) {
  68. $.ajax({
  69. url: 'http://tieba.baidu.com/' + pd.forum.forum_name,
  70. dataType: 'html'
  71. }).done(function(data){
  72. var postPage = parsePost($('body'));
  73. initPage();
  74. initPosts(parsePosts($(data)));
  75. initPost(postPage);
  76. getPostConfig();
  77. });
  78. return;
  79. }
  80. }
  81.  
  82. function initPage() {
  83. var fhtml = parseFooter();
  84. html = tpl.html_header;
  85. html += tpl.html_container.format(tpl.html_box_posts+tpl.html_box_post);
  86. html += tpl.html_footer;
  87. $('body').empty();
  88. $('body').html(html);
  89. // $('#head').html(html);
  90. initHeader();
  91. initFooter(fhtml);
  92. initCss();
  93. bindEvent();
  94. }
  95.  
  96. function initPosts(body) {
  97. $('.posts_paging a').unbind('click');
  98. $('#post_container').empty();
  99. $('#box_posts').html(body);
  100. $('#box_posts').scrollTop(0);
  101. monitorHPage();
  102. };
  103.  
  104. function initPost(body) {
  105. $('.post-page a').unbind('click');
  106. $('#post_container').html(body);
  107. $('#post_container').scrollTop(0);
  108. mointorPPage();
  109. };
  110. function initHeader() {
  111. var hhtml = '<div class="loop-2 tiebalogo"><img src="http://tb2.bdstatic.com/tb/static-common/img/search_logo_7098cbef.png"></div>';
  112. hhtml += '<div class="loop-8">\
  113. <div class="select_box">\
  114. <input type="text" name="query" id="query" class="keyipt">\
  115. <div id="search_list" style="display: none"></div>\
  116. </div>\
  117. </div>';
  118. $('#header').html(hhtml);
  119. };
  120.  
  121. function initFooter(fhtml) {
  122. $('#footer').html(fhtml);
  123. };
  124.  
  125. function initCss(){
  126. $('head').append('<link rel="stylesheet" href="' + tpl.css + '">');
  127. };
  128.  
  129. function monitorHPage() {
  130. $('.posts_paging a').bind('click', function(){
  131. $.ajax({
  132. url:this.href,
  133. dataType: 'html'
  134. }).done(function(data){
  135. initPosts(parsePosts($(data)));
  136. });
  137.  
  138. return false;
  139. });
  140. $('.posts_list li').bind('click', function(){
  141. $.ajax({
  142. url: $(this).data('href'),
  143. dataType: 'html'
  144. }).done(function(data){
  145. initPost(parsePost($(data)));
  146. });
  147. });
  148. };
  149. function mointorPPage() {
  150. $('.post-page a').bind('click', function(){
  151. $.ajax({
  152. url: this.href,
  153. dataType: 'html'
  154. }).done(function(data){
  155. initPost(parsePost($(data)));
  156. });
  157. return false;
  158. });
  159. };
  160. function mointorSearch(){
  161. $.ajax({
  162. url: 'http://tieba.baidu.com/suggestion',
  163. data: $('#query').serialize(),
  164. dataType: 'json',
  165. }).done(function(data){
  166. $('#search_list').html(parseSearch(data));
  167. });
  168. };
  169. window.handleSearchResult = function(forum){
  170. $.ajax({
  171. url:'http://tieba.baidu.com/' + forum,
  172. dataType: 'html'
  173. }).done(function(data){
  174. initPosts(parsePosts($(data)));
  175. });
  176. };
  177.  
  178.  
  179. function getPostConfig(){
  180. $.ajax({
  181. url: 'http://tieba.baidu.com/dc/common/tbs',
  182. dataType: 'json'
  183. }).done(function(data){
  184. post_config.tbs = data.tbs;
  185. });
  186. };
  187. function bindEvent() {
  188. $('#query').bind('keyup', function(){
  189. $('#search_list').show();
  190. mointorSearch();
  191. });
  192. $('#query').bind('click', function(){
  193. $('#search_list').show();
  194. mointorSearch();
  195. });
  196. $('#search_list').hover(function(){
  197. $(this).show();
  198. }, function(){
  199. $(this).hide();
  200. });
  201. };
  202. function parseFooter() {
  203. var tf = $('#footer').html();
  204. var fhtml = '<div class="loop-12">' + tf + '</div>';
  205. return fhtml;
  206. };
  207. function parseSearch(data) {
  208. var qms = data.query_match.search_data;
  209. if (qms.length==0) {
  210. return '<p>无数据';
  211. }
  212. var qhtml = '<ul>';
  213. for(var i=0; i<qms.length; i++) {
  214. qhtml += '<li onclick="handleSearchResult(&quot;' + qms[i].fname + '&quot;)">\
  215. <div class="sh_forum_name">' + qms[i].fname + '</div>\
  216. <div class="sh_forum_desc">' + qms[i].forum_desc + '</div>';
  217. }
  218. qhtml += '</ul>';
  219. return qhtml;
  220. };
  221. function parsePosts(postsDom) {
  222. var h_posts = postsDom.find('li.j_thread_list');
  223. var h_paging = postsDom.find('#frs_list_pager');
  224. var h_cur_page = postsDom.find('#frs_list_pager .cur');
  225. var h_cur_url = !h_cur_page.length ? '#?' + window.Math.random() : '/f?kw=' + pd.forum.forum_name + '&pn=' + (h_cur_page.text()*50-50);
  226. var ho_pobj = {}, posts_html='';
  227. posts_html='<div class="span"><div class="loop-12 posts_list"><ul>';
  228. for(var i=0; i<h_posts.length; i++) {
  229. var hp = h_posts[i];
  230. var hp_rep_num = $(hp).find('.threadlist_rep_num')[0].textContent;
  231. var hp_title = $(hp).find('.j_th_tit')[1].textContent;
  232. var hp_href = $(hp).find('.j_th_tit')[1].href;
  233. var hp_detail = !$(hp).find('.threadlist_text')[1] ? '' : $(hp).find('.threadlist_text')[1].textContent;
  234. var hp_author = !$(hp).find('.j_user_card')[0] ? '' : $(hp).find('.j_user_card')[0].textContent;
  235. var hp_last_repuser = !$(hp).find('.j_user_card')[1] ? '' : $(hp).find('.j_user_card')[1].textContent;
  236. var hp_last_time = !$(hp).find('.j_reply_data')[0] ? '' : $(hp).find('.j_reply_data')[0].textContent;
  237. posts_html += '<li data-href="' + hp_href + '">\
  238. <div class="span">\
  239. <div class="loop-10 post_title hidefont" title="' + hp_title + '">' + hp_title + '</div>\
  240. <div class="loop-2 post_author hidefont" title="' + hp_author + '">' + hp_author + '</div>\
  241. <div class="loop-12 box_posts_detail">' + hp_detail + '</div>\
  242. <div class="loop-5 post_repuser hidefont">最后回复人:' + hp_last_repuser + '</div>\
  243. <div class="loop-5 post_lasttime">最后回复时间:' + hp_last_time + '</div></div>';
  244. }
  245. posts_html += '</ul></div>';
  246. posts_html += '<div class="loop-4 posts_paging">' + (!h_paging.length ? '' : h_paging.html()) + '<a href="' + h_cur_url + '">刷新</a></div></div>';
  247. return posts_html;
  248. }
  249. function parsePost(postDom) {
  250. var post_title = postDom.find('.core_title_txt').html()
  251. var post_info = postDom.find('.l_post');
  252. var post_content = postDom.find('.p_content cc');
  253. var author_avatar = postDom.find('.p_author_face img');
  254. var lzlbox = postDom.find('j_lzl_c_b_a');
  255. var ppage = postDom.find('.pb_list_pager')[0];
  256. var post_html = '';
  257. post_html += '<div class="loop-12 post_title">' + post_title + '</div>';
  258. for(var i=0; i<post_info.length; i++) {
  259. var pi = $(post_info[i]).data('field');
  260. var pc = post_content[i];
  261. post_html += '<section data-post="' + pi.content.post_id + '">';
  262. post_html += '<div class="loop-2 post_info">\
  263. <div class="loop-12 post_author" data-user="' + pi.author.user_id + '">\
  264. <div><img src="http://tb.himg.baidu.com/sys/portrait/item/' + pi.author.portrait + '"></div>\
  265. <span>' + pi.author.user_name + '</span>\
  266. </div>\
  267. <div class="loop-12 post_author_level">\
  268. <span>' + (pi.author.level_name||'*') + '</span>\
  269. <span>' + (pi.author.level_id||'0') + '</span>\
  270. </div>\
  271. </div>';
  272. post_html += '<div class="loop-10 post_article">' + pc.innerHTML + '</div>';
  273. post_html += '<div class="loop-10 post_msg">' + pi.content.date + '</div>';
  274. post_html += '<div class="loop-10 post_lzl">' + getPostLzl(lzlbox, i) + '</div>';
  275. post_html += '</section>';
  276. }
  277. post_html += '<div id="ue_texteara" class="loop-12"><script id="ueditor_tieba" name="content" type="text/plain">这里写你的初始化内容</script></div><div class="loop-12"><textarea id="post_editor" /></div><div class="loop-12"><button>回复</button></div>';
  278. post_html += '<div class="loop-8 post-page">' + ppage.innerHTML + '</div>';
  279. // <a href="'+(($(ppage).find('a'))[0].href.split('?')[0]+'?see_lz=1')+'">只看楼主</a>
  280. post_html='<div class="span box_post">' +post_html+ '</div>';
  281. return post_html;
  282. }
  283. function getPostLzl(lzldom, index) {
  284. var lzlbox = lzldom[index];
  285. if (!lzlbox) { return ''; }
  286. var lzlreps = $(lzlbox).find('li');
  287. var lzlhtml = '<ul>';
  288. for(var i=0; i<lzlreps.length; i++) {
  289. var lzlinfo = $(lzlreps[i]).data('field');
  290. var lzltext = $(lzlreps[i]).find('.lzl_cnt span.lzl_content_main').html();
  291. var lzltime = $(lzlreps[i]).find('.lzl_cnt span.lzl_time').html();
  292. var llio = eval('(' + lzlinfo + ')');
  293. lzlhtml += '<li data-pid="' + llio.pid + '" data-spid="'+llio.spid+'">\
  294. <div class="span">\
  295. <div class="loop-2">' + llio.user_name + '</div>\
  296. <div class="loop-8">' + lzltext + '</div>\
  297. <div class="loop-2">' + lzltime + '</div>\
  298. </div>';
  299. }
  300. lzlhtml += '</ul>';
  301. return lzlhtml;
  302. };
  303.  
  304.  
  305. initBorer();
  306. })(window, jQuery);