- // ==UserScript==
- // @name Baidu Tieba Quote and Post
- // @version 2.2.2.0
- // @icon http://imgsrc.baidu.com/forum/pic/item/911e12087bf40ad13d03ebde552c11dfa8ecce89.jpeg
- // @description 百度贴吧图片引用 作者:铅笔、修正:huhu
- // @include http://tieba.baidu.com/p/*
- // @include http://tieba.baidu.com.cn/p/*
- // @include http://tieba.baidu.cn/p/*
- // @include http://tieba.baidu.com/f*
- // @include http://tieba.baidu.com.cn/f*
- // @include http://tieba.baidu.cn/f*/f?*
- // @copyright 5B4B
- // @namespace 5B4B
- // ==/UserScript==
-
- function init() {
-
- //////
- //// 设置
- //
- var font_family = '"微软雅黑"',
- font_size = '14px',
- line_height = '16px',
- font = font_size + ' ' + font_family,
- colour='';//自定义颜色,默认随机
- //////
- //// 产生引用内容
- //
-
- function addQuote(textarea, content, pid) {
- var canvas = $('<canvas>').attr({
- width: 0,
- height: 0
- }).get(0);
- var ctx,
- style = [
- 'font-family:' + font_family,
- 'font-weight:normal',
- 'font-style:normal',
- 'font-size:' + font_size,
- 'line-height:' + line_height
- ].join(';'),
- metrix = measureText(content, style, 540);
- content=metrix.content;
- canvas.width = metrix.width + 10;
- canvas.height = metrix.height + 10;
- ctx = canvas.getContext('2d');
- ctx.clearRect(0, 0, canvas.width, canvas.height);
- ctx.globalAlpha = 1.0;
- ctx.setFillColor('transparent');
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.fillStyle = 'black';
- ctx.font = font;
- ctx.textAlign = 'left';
- ctx.textBaseline = 'top';
- content.trim().split(/[\n\r]/).forEach(function(str, i) {
- ctx.fillText(str, 5, 5 + 14 * i + 2 * i);
- });
- ctx.lineWidth=3;
- ctx.strokeStyle = colour||('#'+(Math.random()*0xffffff<<0).toString(16));
- ctx.strokeRect(0, 0, canvas.width, canvas.height);
-
- var savedURL = LetItGo.get('BTQP-PID-' + pid);
- if (savedURL) {
- addQuotePic(savedURL);
- } else {
- uploadPic({
- pid: pid,
- blob: dataURLtoBlob(canvas.toDataURL())
- }, addQuotePic);
- }
- }
-
- function addQuotePic(url, pid) {
- LetItGo.set('BTQP-PID-' + pid, url);
- $(textarea).find('.BDE_Image[pic_type="9"]:first')
- .attr('src', url).attr('pic_type', 1).attr('onload', 'EditorUI.resizeImage(this, 560)');
- //.removeAttr('pic_type');
- textarea.focus();
- var html = textarea.innerHTML;
- document.execCommand('selectAll', false, null);
- document.execCommand('insertHTML', false, html);
- }
-
- function uploadPic(data, callback) {
- var blob = data.blob,
- pid = data.pid;
- var xhr = new XMLHttpRequest(),
- size = blob.size;
- xhr.open('GET', 'http://tieba.baidu.com/dc/common/imgtbs?t=' + new Date().getTime(), true);
- xhr.onload = function() {
- var res = JSON.parse(this.responseText);
- if (res.no !== 0) {
- failedCallback();
- }
- var tbs = res.data.tbs,
- formData = new FormData();
- xhr.abort();
- xhr.open('POST', 'http://upload.tieba.baidu.com/upload/pic?is_wm=1&tbs=' + tbs, true);
- xhr.withCredentials = true;
- xhr.onload = function() {
- var res = JSON.parse(this.responseText);
- if (res.error_code !== 0) {
- alert('上传图片失败!');
- return;
- }
- var pic_url = 'http://imgsrc.baidu.com/forum/pic/item/' + res.info.pic_id_encode + '.jpg';
- callback(pic_url, pid);
- };
- formData.append('fid', PageData.forum.id);
- formData.append('Filename', 'blob.png');
- formData.append('file', blob);
- xhr.send(formData);
- };
- xhr.onerror = function() {
- alert('上传准备失败!');
- };
- xhr.send();
- }
-
- function dataURLtoBlob(dataURL) {
- var data = atob(dataURL.split(",")[1]),
- arrayBuffer = new ArrayBuffer(data.length),
- byteArray = new Uint8Array(arrayBuffer);
- for (var i = 0, l = data.length; i < l; ++i) {
- byteArray[i] = data.charCodeAt(i)
- }
- return new window.Blob([byteArray], {
- type: 'image/png'
- });
- }
-
- function measureText(content, style, width) {
- var res = '',
- text = content,
- maxwidth = 0;
- var canvas = $('<canvas>').attr({
- width: width,
- height: 100
- }).get(0),
- ctx;
- ctx = canvas.getContext('2d');
- ctx.font = font;
- for (var i = 0, l = text.length, line = '', tl, th, thx = 0; i < l; ++i) {
- tl = line + text[i];
- th = thx + ctx.measureText(tl).width;
- if (th <= width) {
- thx = th;
- res += tl
- } else {
- thx = ctx.measureText(text[i]).width;
- res += '\n' + text[i];
- line = '';
- }
- if (maxwidth < thx) maxwidth = thx;//console.log(maxwidth,res);
- }
- var body = window.document.body,
- dummy = $('<div>').html(res.replace(/[\n\r]/g, '<br/>')).attr('style', style).get(0),
- result = {};
- dummy.style.zIndex = '-1';
- dummy.style.display = 'block';
- dummy.style.width = '-webkit-fit-content';
- dummy.style.whiteSpace = 'pre';
- body.appendChild(dummy);
- result.width = maxwidth; //dummy.offsetWidth;
- result.height = dummy.offsetHeight;
- result.content = res;
- dummy.remove();
- return result;
- }
-
-
- //////
- //// 引用按钮
- //
-
- function addBtnsEvents() {
- //$('.l_post').on('mouseover.btqp', '.j_lzl_wrapper', function(e) {
- $('.p_postlist').delegate('.l_post','mouseover.btqp', '.j_lzl_wrapper', function(e) {
- var $self = $(e.currentTarget || this);
- if ($self.find('.btqp_btn_a').length <= 0) {
- var $partOne = $self.find('.p_tail');
- $partOne.append($('<li><span><a class="btqp_btn_a" btqp_n="false">简引</a> <a class="btqp_btn_a">引用</a></span></li>').find('a').css({
- cursor: 'pointer'
- }).on('click.btqp', btnEventA).end());
- }
- if ($self.find('.btqp_btn_b').length <= 0) {
- var $partTwo = $self.find('.lzl_s_r');
- $partTwo.before($('<span><a class="btqp_btn_b" btqp_n="false">简引</a> | <a class="btqp_btn_b">引用</a> | </span>').find('a').css({
- color: '#666',
- cursor: 'pointer'
- }).on('click.btqp', btnEventB).end());
- }
- });
- }
-
- function btnEventA(e) {
- e.stopPropagation();
- e.preventDefault();
-
-
- var $self = $(e.currentTarget || this),
- $post = $self.closest('.l_post'),
- toQuote = !$self.attr('btqp_n'),
- content = $post.find('.d_post_content').html(),
- info = JSON.parse($post.attr('data-field')),
- pid = info.content.id,
- floor = info.content.post_no,
- user = info.author.user_name,
- toAuthor = (PageData.thread.author === user),
- toSelf = (PageData.user.name === user),
- atUser = ((toAuthor || toSelf) ? '@\u202D' : '@') + user + ' ';
- modify(floor, atUser, content, pid, toQuote);
-
- return false;
- }
-
- function btnEventB(e) {
- e.stopPropagation();
- e.preventDefault();
-
-
- var $self = $(e.currentTarget || this),
- content = $self.closest('.lzl_content_reply').prevAll('.lzl_content_main').html(),
- infoA = $.json.decode($self.closest('.l_post').attr('data-field')),
- infoB = $.json.decode($self.closest('.lzl_single_post').attr('data-field')),
- toQuote = !$self.attr('btqp_n'),
- floor = infoA.content.post_no,
- pid = infoB.spid,
- userB = infoB.user_name,
- toAuthor = (PageData.thread.author === userB),
- toSelf = (PageData.user.name === userB),
- atUser = ((toAuthor || toSelf) ? '@\u202D' : '@') + userB + ' '; console.log($self.closest('.l_post').attr('data-field'));
- modify(floor, atUser, content, pid, toQuote);
-
- return false;
- }
-
-
-
- function modify(floor, atUser, content, pid, toQuote) {
- $textarea = $('#tb_rich_poster_container').find('#ueditor_replace');
- textarea = $textarea.get(-1);
- var html = textarea.innerHTML,
- quote = '';
- var reg = new RegExp('^回\\d+楼.+?\\u202D{2}.*?\\u202D{2}|^回\\d+楼(?: | )@\u202D?.+?(?: | )', 'i');
- textarea.scrollIntoViewIfNeeded();
- textarea.focus();
- content = content.replace(/^回(?:<a[^>]+>)?\d+楼(?:<\/a>)?.+?<br>/g, '').replace(/<br.*?>/gi, '').replace(/<img.*?>/gi, '[图片]').replace(/<embed.*?>/gi, '[影音]').replace(/<div class="video_src_wrapper.*?<\/a><\/span><\/div>/gi, '[视频]').replace(/<div class="voice_player.*?<\/div>/gi, '[语音]').replace(/\u202D{2}.*?\u202D{2}/, '').replace(/\u202D/g, '').replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/ /g, ' ');
- content = flat(content);
- if (content.length > 250) {
- content = content.substr(0, 250) + '\n...[省略N字]';
- }
- //content = setWidth(content, 520);
- if (toQuote) {
- quote = '<br>\u202D\u202D<img pic_type="9" class="BDE_Image" src="http://imgsrc.baidu.com/forum/pic/item/32645c086e061d958b03f63f7af40ad163d9cad2.png">\u202D\u202D';
- }
- if (html.replace(/<br>| | |\s/g, '') !== '') {
- if (reg.test(html)) {
- html = html.replace(reg, '回' + floor + '楼 ' + atUser + quote);
- } else {
- html = '回' + floor + '楼 ' + atUser + quote + '<br><br>' + html;
- }
- } else {
- html = '回' + floor + '楼 ' + atUser + quote + '<br><br> ';
- }
- document.execCommand('selectAll', false, null);
- document.execCommand('insertHTML', false, html);
- if (toQuote) {
- addQuote(textarea, content, pid);
- }
- }
-
- function flat(content) {
- content = content.replace(/<.+?>(.*?)<\/.+?>/gi, '$1');
- if (/<.+?>.*?<\/.+?>/.test(content)) {
- return flat(content);
- }
- return content.trim();
- }
-
- function byteLength(c) {
- return /[\x00-\xFF]/.test(c) ? 0.5 : 1;
- }
-
-
- //////
- //// 初始化
- //
- var LetItGo = {
- set: function(key, val) {
- sessionStorage.setItem(key, JSON.stringify(val));
- },
- get: function(key, def) {
- return JSON.parse(sessionStorage.getItem(key)) || def;
- }
- };
- var $textarea, textarea;
- $(function() { //$textarea = $('#editor').find('.tb-editor-editarea');
- //textarea = $textarea.get(-1);
- addBtnsEvents();
- });
-
-
- //////
- //// 生成节点监听
- //
- }
-
-
- //////
- //// Initialization
- //
- var script = document.createElement('script');
- script.id = '__5B4B_BTQP__';
- script.charset = 'utf-8';
- script.type = 'text/javascript';
- script.innerHTML = 'try{(' + init.toString() + ')()}catch(e){console.log(e)}';
- document.body.appendChild(script);