Greasy Fork is available in English.
A new Text Box for PKU BBS
// ==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 + '[m'; 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');