tb_borer

tba_style

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        tb_borer
// @namespace   http://wp.stf.iaceob.name
// @description tba_style
// @include     http://tieba.baidu.com/*
// @version     1.2
// @grant       none
// @author 生物烯丙菊
// ==/UserScript==

String.prototype.format = function () {
  var txt = this.toString();
  for (var i = 0; i < arguments.length; i++) {
    var exp = getStringFormatPlaceHolderRegEx(i);
    txt = txt.replace(exp, (arguments[i] == null ? "" : arguments[i]));
  }
  return cleanStringFormatResult(txt);
}
function getStringFormatPlaceHolderRegEx(placeHolderIndex) {
  return new RegExp('({)?\\{' + placeHolderIndex + '\\}(?!})', 'gm');
}
function cleanStringFormatResult(txt) {
  if (txt == null) return "";
  return txt.replace(getStringFormatPlaceHolderRegEx("\\d+"), "");
}



!(function(window, $, undefined){
  var topic = $('#thread_topic');
  var h_posts = $('#thread_list li.j_thread_list');
  var h_paging = $('#frs_list_pager');
  var me = $('#balv_mod');
  var html = '';

  var document = window.document;
  var pd = window.PageData;
  var tpl = {};
  var config = {
    post: {
      handle_url: 'http://tieba.baidu.com/f/commit/post/add',
      forum_id: 0,
      thread_id: 0,
      forum_name: '',
      tbs: ''
    }
  };
  window.cfg = config;

  tpl.html_header = '<header id="header" class="loop-12"></header>';
  tpl.html_container = '<div class="span container">{0}</div>';
  tpl.html_footer = '<footer id="footer" class="loop-12">Footer</footer>';
  tpl.html_box_posts = '<div class="loop-4 box_posts" id="box_posts"></div>';
  tpl.html_box_post = '<div class="loop-8 post_container" id="post_container"></div>';
  tpl.css = 'http://idc.iaceob.name/tba_style/tba_v1.css';
    

  if (location.href === 'http://tieba.baidu.com/') {
    return;
  }

  if (!pd) {
    return;
  }

  function initBorer() {
    if (!!pd.forum.id) {
      var postsPage = parsePosts($('body'));
      initPage();
      initPosts(postsPage);
      return;
    }
    if (!!pd.forum.forum_id) {
      $.ajax({
        url: 'http://tieba.baidu.com/' + pd.forum.forum_name,
        dataType: 'html'
      }).done(function(data){
        setPostConfig($('body').text());
        var postPage = parsePost($('body'));
        initPage();
        initPosts(parsePosts($(data)));
        initPost(postPage);
      });
      return;
    }
  }

  function initPage() {
      var fhtml = parseFooter();
      html = tpl.html_header;
      html += tpl.html_container.format(tpl.html_box_posts+tpl.html_box_post);
      html += tpl.html_footer;
      $('body').empty();
      $('body').html(html);
      // $('#head').html(html);
      initHeader();
      initFooter(fhtml);
      initCss();
      bindEvent();
  };

  function initPosts(body) {
      $('.posts_paging a').unbind('click');
      $('#post_container').empty();
      $('#box_posts').html(body);
      $('#box_posts').scrollTop(0);
      monitorHPage();
  };

  function initPost(body) {
      $('.post-page a').unbind('click');
      $('#post_container').html(body);
      $('#post_container').scrollTop(0);
      mointorPPage();
  };
  
  function initHeader() {
    var hhtml = '<div class="loop-2 tiebalogo"><img src="http://tb2.bdstatic.com/tb/static-common/img/search_logo_7098cbef.png"></div>';
    hhtml += '<div class="loop-8">\
    <div class="select_box">\
    <input type="text" name="query" id="query" class="keyipt">\
    <div id="search_list" style="display: none"></div>\
    </div>\
    </div>';
    $('#header').html(hhtml);
  };

  function initFooter(fhtml) {
    $('#footer').html(fhtml);
  };

  function initCss(){
    $('head').append('<link rel="stylesheet" href="' + tpl.css + '">');
  };

  function monitorHPage() {
    $('.posts_paging a').bind('click', function(){
      $.ajax({
        url:this.href,
        dataType: 'html'
      }).done(function(data){
        initPosts(parsePosts($(data)));
      });

      return false;
    });
    $('.posts_list li').bind('click', function(){
      $.ajax({
        url: $(this).data('href'),
        dataType: 'html'
      }).done(function(data){
        initPost(parsePost($(data)));
        setPostConfig($(data).text());
      });
    });
  };
  
  function mointorPPage() {
    $('.post-page a').bind('click', function(){
      $.ajax({
        url: this.href,
        dataType: 'html'
      }).done(function(data){
        initPost(parsePost($(data)));
        setPostConfig($(data).text());
      });
      return false;
    });
    $('#btn_post').bind('click', function(){
      var post_content = $('#post_editor').val();
      $.ajax({
        url: config.post.handle_url,
        type: 'post',
        data: { 
          kw: config.post.forum_name,
          id: 'utf-8',
          rich_text: 1,
          floor_num: 1,
          fid: config.post.forum_id,
          tid: config.post.thread_id,
          content: post_content,
          anonymous: 0,
          tbs: config.post.tbs
        },
        dataType: 'json'
      }).done(function(data){
        console.log(data);
        if (!!data.no) {
          console.log('no:'+data.no+'\nerr_code:'+data.err_code+'\nerror:'+data.error);
          return;
        }
        console.log('success');
      });
    });
  };
  
  function mointorSearch(){
    $.ajax({
      url: 'http://tieba.baidu.com/suggestion',
      data: $('#query').serialize(),
      dataType: 'json',
    }).done(function(data){
      $('#search_list').html(parseSearch(data));
    });
  };
  
  window.handleSearchResult = function(forum){
    $.ajax({
      url:'http://tieba.baidu.com/' + forum,
      dataType: 'html'
    }).done(function(data){
      initPosts(parsePosts($(data)));
    });
  };


  function setPostConfig(text){
    var tbs1 = text.match(/PageData([ ]*)=([ ]*){(.*?)'tbs'(.*?):(.*?)"(.*?)"/);
    var tbs2 = text.match(/PageData([ ]*)=([ ]*){(.*?)tbs(.*?):(.*?)'(.*?)'/);
    var fid = text.match(/PageData.forum([ ]*)=([ ]*){(.*?)"forum_id":(\d+)/);
    var fe = text.match(/PageData.forum([ ]*)=([ ]*){(.*?)"forum_name":"(.*?)"/);
    var tid = text.match(/PageData.thread([ ]*)=([ ]*){(.*?)thread_id(.*?):(\d+)/);
    config.post.tbs = !tbs1 ? tbs2[6] : tbs1[6];
    config.post.forum_id = !fid ? 0 : fid[4];
    config.post.forum_name = !fe ? '' : dencodeUnicode(fe[4]);
    config.post.thread_id = !tid ? 0 : tid[5];
  };
  
  function bindEvent() {
    $('#query').bind('keyup', function(){
      $('#search_list').show();
      mointorSearch();
    });
    $('#query').bind('click', function(){
      $('#search_list').show();
      mointorSearch();
    });
    $('#search_list').hover(function(){
      $(this).show();
    }, function(){
      $(this).hide();
    });
  };
  
  function parseFooter() {
    var tf = $('#footer').html();
    var fhtml = '<div class="loop-12">' + tf + '</div>';
    return fhtml;
  };
  
  function parseSearch(data) {
    var qms = data.query_match.search_data;
    if (qms.length==0) {
      return '<p>无数据';
    }
    var qhtml = '<ul>';
    for(var i=0; i<qms.length; i++) {
      qhtml += '<li onclick="handleSearchResult(&quot;' + qms[i].fname + '&quot;)">\
      <div class="sh_forum_name">' + qms[i].fname + '</div>\
      <div class="sh_forum_desc">' + qms[i].forum_desc + '</div>';
    }
    qhtml += '</ul>';
    return qhtml;
  };
  
  function parsePosts(postsDom) {
    var h_posts = postsDom.find('li.j_thread_list');
    var h_paging = postsDom.find('#frs_list_pager');
    var h_cur_page = postsDom.find('#frs_list_pager .cur');
    var h_cur_url = !h_cur_page.length ? '#?' + window.Math.random() : '/f?kw=' + pd.forum.forum_name + '&pn=' + (h_cur_page.text()*50-50);
    var ho_pobj = {}, posts_html='';
    posts_html='<div class="span"><div class="loop-12 posts_list"><ul>';
    for(var i=0; i<h_posts.length; i++) {
      var hp = h_posts[i];
      var hp_rep_num = $(hp).find('.threadlist_rep_num')[0].textContent;
      var hp_title = $(hp).find('.j_th_tit')[1].textContent;
      var hp_href = $(hp).find('.j_th_tit')[1].href;
      var hp_detail = !$(hp).find('.threadlist_text')[1] ? '' : $(hp).find('.threadlist_text')[1].textContent;
      var hp_author = !$(hp).find('.j_user_card')[0] ? '' : $(hp).find('.j_user_card')[0].textContent;
      var hp_last_repuser = !$(hp).find('.j_user_card')[1] ? '' : $(hp).find('.j_user_card')[1].textContent;
      var hp_last_time = !$(hp).find('.j_reply_data')[0] ? '' : $(hp).find('.j_reply_data')[0].textContent;
      posts_html += '<li data-href="' + hp_href + '">\
      <div class="span">\
      <div class="loop-10 post_title hidefont" title="' + hp_title + '">' + hp_title + '</div>\
      <div class="loop-2 post_author hidefont" title="' + hp_author + '">' + hp_author + '</div>\
      <div class="loop-12 box_posts_detail">' + hp_detail + '</div>\
      <div class="loop-5 post_repuser hidefont">最后回复人:' + hp_last_repuser + '</div>\
      <div class="loop-5 post_lasttime">最后回复时间:' + hp_last_time + '</div></div>';
    }
    posts_html += '</ul></div>';
    posts_html += '<div class="loop-4 posts_paging">' + (!h_paging.length ? '' : h_paging.html()) + '<a href="' + h_cur_url + '">刷新</a></div></div>';
    return posts_html;
  }
  
  
  function parsePost(postDom) {
    var post_title = postDom.find('.core_title_txt').html()
    var post_info = postDom.find('.l_post');
    var post_content = postDom.find('.p_content cc');
    var author_avatar = postDom.find('.p_author_face img');
    var lzlbox = postDom.find('j_lzl_c_b_a');
    var ppage = postDom.find('.pb_list_pager')[0];
    var post_html = '';
    post_html += '<div class="loop-12 post_title">' + post_title + '</div>';
    for(var i=0; i<post_info.length; i++) {
      var pi = $(post_info[i]).data('field');
      var pc = post_content[i];
      post_html += '<section data-post="' + pi.content.post_id + '">';
      post_html += '<div class="loop-2 post_info">\
      <div class="loop-12 post_author" data-user="' + pi.author.user_id + '">\
        <div><img src="http://tb.himg.baidu.com/sys/portrait/item/' + pi.author.portrait + '"></div>\
        <span>' + pi.author.user_name + '</span>\
      </div>\
      <div class="loop-12 post_author_level">\
        <span>' + (pi.author.level_name||'*') + '</span>\
        <span>' + (pi.author.level_id||'0') + '</span>\
      </div>\
      </div>';
      post_html += '<div class="loop-10 post_article">' + pc.innerHTML + '</div>';
      post_html += '<div class="loop-10 post_msg">' + pi.content.date + '</div>';
      post_html += '<div class="loop-10 post_lzl">' + getPostLzl(lzlbox, i) + '</div>';
      post_html += '</section>';
    }
    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 id="btn_post">回复</button></div>';
    post_html += '<div class="loop-8 post-page">' + ppage.innerHTML + '</div>';
    // <a href="'+(($(ppage).find('a'))[0].href.split('?')[0]+'?see_lz=1')+'">只看楼主</a>
    post_html='<div class="span box_post">' +post_html+ '</div>';
    return post_html;
  }
  
  function getPostLzl(lzldom, index) {
    var lzlbox = lzldom[index];
    if (!lzlbox) { return ''; }
    var lzlreps = $(lzlbox).find('li');
    var lzlhtml = '<ul>';
    for(var i=0; i<lzlreps.length; i++) {
      var lzlinfo = $(lzlreps[i]).data('field');
      var lzltext = $(lzlreps[i]).find('.lzl_cnt span.lzl_content_main').html();
      var lzltime = $(lzlreps[i]).find('.lzl_cnt span.lzl_time').html();
      var llio = eval('(' + lzlinfo + ')');
      lzlhtml += '<li data-pid="' + llio.pid + '" data-spid="'+llio.spid+'">\
      <div class="span">\
      <div class="loop-2">' + llio.user_name + '</div>\
      <div class="loop-8">' + lzltext + '</div>\
      <div class="loop-2">' + lzltime + '</div>\
      </div>';
    }
    lzlhtml += '</ul>';
    return lzlhtml;
  };

  function encodeUnicode(str){
    return escape(str).toLocaleLowerCase().replace(/%u/gi,'\\u');
  };

  function dencodeUnicode(str){
    return unescape(str.replace(/\\u/gi,'%u'));
  };

  initBorer();
})(window, jQuery);