bdwmTextBox

A new Text Box for PKU BBS

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        bdwmTextBox
// @namespace   bdwmTextBox
// @description A new Text Box for PKU BBS
// @include     *bdwm.net/bbs/bbspst.php*
// @include     *bdwm.net/bbs/bbspsm.php*
// @version     0.1beta
// @grant       none
// ==/UserScript==

/**
 * cursorPosition Object
 *
 * Created by Blank Zheng on 2010/11/12.
 * Copyright (c) 2010 PlanABC.net. All rights reserved.
 * 
 * The copyrights embodied in the content of this file are licensed under the BSD (revised) open source license.
 */
 
var cursorPosition = {
	get: function (textarea) {
		var rangeData = {text: "", start: 0, end: 0 };
	
		if (textarea.setSelectionRange) { // W3C	
			textarea.focus();
			rangeData.start= textarea.selectionStart;
			rangeData.end = textarea.selectionEnd;
			rangeData.text = (rangeData.start != rangeData.end) ? textarea.value.substring(rangeData.start, rangeData.end): "";
		}
		
		return rangeData;
	},
	
	set: function (textarea, rangeData) {
		if(!rangeData) {
			alert("You must get cursor position first.")
		}
		textarea.focus();
		if (textarea.setSelectionRange) { // W3C
			textarea.setSelectionRange(rangeData.start, rangeData.end);
		} 
	},

	add: function (textarea, rangeData, text) {
		var oValue, nValue, nStart, nEnd, st;
		this.set(textarea, rangeData);
		
		if (textarea.setSelectionRange) { // W3C
			oValue = textarea.value;
			nValue = oValue.substring(0, rangeData.start) + text + oValue.substring(rangeData.end);
			nStart = nEnd = rangeData.start + text.length;
			st = textarea.scrollTop;
			textarea.value = nValue;
			// Fixbug:
			// After textarea.values = nValue, scrollTop value to 0
			if(textarea.scrollTop != st) {
				textarea.scrollTop = st;
			}
			textarea.setSelectionRange(nStart, nEnd);
		} 
	}
}

function setTextAttr(textarea, attr) {
  range = cursorPosition.get(textarea);
  nText = '[' + attr + 'm' + range.text + '';
  cursorPosition.add(textarea, range, nText);
}

// 添加颜色下拉条
function addSelect(parent, id, num, name) {
  var colors = [
    '黑色',
    '红色',
    '绿色',
    '黄色',
    '蓝色',
    '品红',
    '蓝绿',
    '白色'
  ];
  
  // 添加标题
  var title = document.createElement('span');
  title.innerHTML = name;
  parent.appendChild(title);
  
  // 生成下拉条
  var mySelect = document.createElement('select');
  mySelect.id = id;
  for (var i = 0; i < colors.length; i++) {
    var opt = document.createElement('option');
    opt.value = num + i;
    opt.innerHTML = colors[i];
    mySelect.appendChild(opt);
  }
  
  // 默认项: 未选择颜色
  var opt = document.createElement('option');
  opt.value = - 1;
  opt.innerHTML = '不设置';
  opt.selected = 'selected';
  // 设为默认选择
  mySelect.appendChild(opt);
  
  // 加入父节点
  parent.appendChild(mySelect);
  return mySelect;
}

// 添加复选框
function addCheck(parent, val, name) {
  // 标题
  var title = document.createElement('span');
  title.innerHTML = name;
  parent.appendChild(title);
  // 选框
  var box = document.createElement('input');
  box.type = 'checkbox';
  box.value = val;
  
  // 加入父节点
  parent.appendChild(box);
  return box;
}
// 建立表格

function createForm(textarea) {
  var myform = document.createElement('form');
  //选择颜色
  var pColor = document.createElement('p');
  var sfg = addSelect(pColor, 'fgcolor', 30, '前景色');
  var sbg = addSelect(pColor, 'bgcolor', 40, '背景色');
  myform.appendChild(pColor);
  // 复选框
  var pBoxes = document.createElement('p');
  var boxes = [
    addCheck(pBoxes, 1, '高亮'),
    addCheck(pBoxes, 5, '闪烁'),
    addCheck(pBoxes, 4, '下划线')
  ];
  myform.appendChild(pBoxes);
  // 确定按钮
  var btn = document.createElement('input');
  btn.type = 'button';
  btn.value = '确定';
  btn.onclick = function () {
    var attr = '';
    for (var i = 0; i < boxes.length; i++) {
      if (boxes[i].checked) {
        attr += ';' + boxes[i].value;
      }
    }
    if (sbg.value != '-1') {
      attr += ';' + sbg.value;
    }
    if (sfg.value != '-1') {
      attr += ';' + sfg.value;
    }
    setTextAttr(textarea, attr.substring(1));
  };
  myform.appendChild(btn);
  // 关闭按钮
  var closeBtn = document.createElement('input');
  closeBtn.type = 'button';
  closeBtn.value = '关闭';
  closeBtn.onclick = function () {
    this.parentNode.parentNode.style.display = 'none';
  };
  myform.appendChild(closeBtn);
  return myform;
}

console.log('script begins');
/** 寻找目标表单
var frmpost;
if ((frmpost = document.getElementById('postfrm')) != null) {
	console.log('Post form \'postfrm\' found');
} else if ((frmpost = document.getElementById('frmpost')) != null) {
	console.log('Post form \'frmpost\' found');
} else {
	console.log('Post form not found!!!');
}
*/

// 获取文字窗口
console.log('Getting textarea');
var textBoxes = document.getElementsByName('text');
if (textBoxes.length == 0) {
  alert('No such text box!');
}
var textArea = textBoxes[0];
// 设置文本框为10行...
textArea.rows = '10';
console.log('textarea set to 10 lines');

// 建立浮动窗体
console.log('building the textAttr dialog');
var mydiv = document.createElement('div');
mydiv.style.position = 'fixed';
mydiv.style.left = '30%';
mydiv.style.top = '40%';
mydiv.style.backgroundColor = '#89e842';
mydiv.style.display = 'none';
mydiv.appendChild(createForm(textArea));
document.body.appendChild(mydiv);

// 添加按钮
console.log('adding button');
var Buttons = document.getElementsByTagName('input');
var postButton;
for (var i = 0; i < Buttons.length; i++) {
  //alert(Buttons[i].value);
  if (Buttons[i].value == '发表' || Buttons[i].value == '发送') {
    postButton = Buttons[i];
    break;
  }
}
var attrBtn = document.createElement('input')
attrBtn.type = 'button';
attrBtn.onclick = function () {
  console.log('Button clicked');
  mydiv.style.display = 'block';
};
attrBtn.value = '设置文字属性';
postButton.parentNode.insertBefore(attrBtn, postButton.nextSibling);
console.log('script ends');