QR-Plugins.RainbowText

plugins for Kaskus-QR rainbowtext generator

  1. // ==UserScript==
  2. // @name QR-Plugins.RainbowText
  3. // @namespace http://userscripts.org/users/315214
  4. // @include *.kaskus.co.id/thread/*
  5. // @include *.kaskus.co.id/lastpost/*
  6. // @include *.kaskus.co.id/post/*
  7. // @include *.kaskus.co.id/group/discussion/*
  8. // @include *.kaskus.co.id/show_post/*
  9. // @version 0.6
  10. // @dtversion 1210300006
  11. // @timestamp 1351547543977
  12. // @qrversion 4.0.9
  13. // @description plugins for Kaskus-QR rainbowtext generator
  14. // @author tuxie.forte;
  15. // @license (CC) by-nc-sa 3.0
  16. //
  17. // -!--latestupdate
  18. // v0.6 - 2012-10-30
  19. // include new-kaskus (co.id)
  20. //
  21. // v0.5 - 2011-09-03
  22. // improve literaly whitespaces
  23. //
  24. // v0.4 - 2011-08-23
  25. // fix adapting QR container
  26. //
  27. // v0.3 - 2011-08-19
  28. // fix whitespaces with transparent (dirty but safe)
  29. //
  30. // v0.2 - 2011-08-14
  31. // fix char with whitespaces
  32. //
  33. // -/!latestupdate---
  34. // ==/UserScript==
  35. //
  36.  
  37. (function(){
  38. // Initialize Global Variables
  39. var gvar=function() {};
  40.  
  41. /*
  42. window.alert(new Date().getTime());
  43. */
  44. //========-=-=-=-=--=========
  45. gvar.__DEBUG__ = false; // development
  46. //========-=-=-=-=--=========
  47.  
  48.  
  49. // this is where we re-initialize before we trigger start_Main()
  50. // any huge global var or loading any saved value may start in here too
  51. function init_start(){
  52.  
  53. gvar.B = rSRC.getSetOf('button');
  54. gvar.tID = "reply-messsage";
  55.  
  56. start_Main();
  57. }
  58. // =====
  59. // START
  60. function start_Main(){
  61. var el, Attr, par = gID(gvar.qr_identity);
  62.  
  63. if( par ){
  64. Attr = {'src':gvar.B.rainbow_gif, style:'vertical-align:bottom;', alt:'[rainbow]', title:'Wrap [Rainbow-COLOR] tags around selected text'};
  65. el = createEl('img',Attr);
  66. _o('click', el, function(e){return handleClick(e)} );
  67.  
  68. Dom.add(el, par);
  69. }
  70. }
  71. function handleClick(e){
  72. var vBText = _TEXT.init();
  73. if(!vBText) return;
  74.  
  75. var endFocus = function(){ _TEXT.focus(); return false},
  76. selected = _TEXT.getSelectedText(), ret = '',
  77. text, prehead;
  78.  
  79. text=(selected!= '' ? selected : prompt('Please enter Text to become rainbow:', 'pelangi pelangi') );
  80. if(text==null) return endFocus();
  81.  
  82. ret = MakeSFX(text);
  83. prehead = [0, ret.length];
  84. if(selected=='')
  85. _TEXT.setValue( ret, prehead );
  86. else
  87. _TEXT.replaceSelected( ret, prehead );
  88. }
  89.  
  90. /*=========
  91. # rainbow functionality
  92. # base code by umop ap!sdn
  93. # sources: http://www.tektek.org/color
  94. # =========
  95. */
  96.  
  97. function getSFXColor(a,g_cstyle){var b,c,d,e,f,g;if(g_cstyle==0){e=a;b=127+127*Math.cos(e-.5);c=127+127*Math.cos(e-2.5);d=127+127*Math.cos(e-4.5);f=b;if(c<f)f=c;if(d<f)f=d;b-=f;c-=f;d-=f;g=b;if(c>g)g=c;if(d>g)g=d;g=255/g;b*=g;c*=g;d*=g;var h=200;var i=255;g=h/255*(i/255);f=(255-i)*(h/255);b=b*g+f;c=c*g+f;d=d*g+f;if(b<0)b=0;if(c<0)c=0;if(d<0)d=0;if(b>255)b=255;if(c>255)c=255;if(d>255)d=255}if(g_cstyle==1){a-=Math.floor(a);b=r1+a*dr;c=g1+a*dg;d=b1+a*db}if(g_cstyle==2){a-=2*Math.floor(a/2);if(a<1){b=r1+a*dr;c=g1+a*dg;d=b1+a*db}if(a>=1){a-=2;b=r1-a*dr;c=g1-a*dg;d=b1-a*db}}if(g_cstyle==3){a-=3*Math.floor(a/3);if(a<1){b=r1+a*dr;c=g1+a*dg;d=b1+a*db}if(a>=1&&a<2){a-=1;b=r2+a*dr1;c=g2+a*dg1;d=b2+a*db1}if(a>=2){a-=2;b=r3+a*dr2;c=g3+a*dg2;d=b3+a*db2}}return {r:b,g:c,b:d}}
  98. function tohex(a){var b,c;var d="";b=Math.floor(a%16);c=Math.floor(a/16);if(c<10){d=""+c}if(c>9){switch(c){case 10:d="A";break;case 11:d="B";break;case 12:d="C";break;case 13:d="D";break;case 14:d="E";break;case 15:d="F";break;default:d="X";break}}if(b<10){d=d+""+b}if(b>9){switch(b){case 10:d+="A";break;case 11:d+="B";break;case 12:d+="C";break;case 13:d+="D";break;case 14:d+="E";break;case 15:d+="F";break;default:d+="X";break}}return d}
  99.  
  100. function MakeSFX(inputString){
  101. var i, j, k, l, c;
  102. var x, scale, res=1;
  103. var oignumi = 0;
  104. var gradientType = "rainbow";
  105.  
  106. var temp = new String("");
  107. var numreps = 1;
  108.  
  109. // Initialize string variables
  110. var instr = trimStr(inputString);
  111. var outstr = new String("");
  112. var tempstr = new String("");
  113.  
  114. // Get the length and scale. For rainbows, the scale must be such that one cycle comes out to almost 2pi.
  115. j = instr.length;
  116. if (gradientType == "rainbow"){
  117. scale = Math.PI * (2 * eval(numreps) - .21) / j;
  118. g_cstyle = 0;
  119. }
  120.  
  121. // Start the loop
  122. for (i=0; i<j; i++){
  123.  
  124. // Determine the RGB values
  125. k = scale * i;
  126.  
  127. c = getSFXColor(k,g_cstyle);
  128. // Convert to hexadecimal
  129. tempstr = tohex(c.r) + tohex(c.g) + tohex(c.b);
  130.  
  131. // Get the character to colorize
  132. temp = instr.charAt(i);
  133.  
  134. // Is it a &; code?
  135. if (temp == "&"){
  136.  
  137. // Search forward until either a semicolon, tag, or space is found
  138. for (l=i+1; l<j; l++){
  139. if (instr.charAt(l) == " ") break;
  140. if (instr.charAt(l) == "<") break;
  141. if (instr.charAt(l) == ">") break;
  142. if (instr.charAt(l) == ";") break;
  143. } // for l
  144.  
  145. // If it's a semicolon, then we have ourselves a character.
  146. if (instr.charAt(l) == ";")
  147. temp = instr.substr(i, l-i+1);
  148. }
  149.  
  150. // perform BBCode output
  151. if (i % res == 0) {
  152. // Is it a whitespace?
  153. outstr = outstr + (temp!= " " ? '[color=' + '#' + tempstr + ']' : temp);
  154. oignumi = 1;
  155. }
  156. outstr = outstr + temp;
  157.  
  158. if ((i+1) % res == 0) {
  159. outstr = outstr + (temp!=" " ? '[/color]' : "");
  160. oignumi = 0;
  161. }
  162. // out_format = BBCode
  163.  
  164. if (temp.length > 1) i += (temp.length - 1);
  165. }
  166. if (oignumi > 0)
  167. outstr = outstr + '[/color]';
  168.  
  169. return outstr;
  170. }
  171.  
  172.  
  173.  
  174.  
  175.  
  176. // -
  177. // -
  178. // -
  179. // -
  180. //=========
  181. // code below should adapting current QR Engine for this plugins works
  182. // leave code below as wot it is, as long you know what todo
  183. //========= Common Functions && Global Var Init ====
  184. // static routine
  185. function isDefined(x) { return !(x == null && x !== null); }
  186. function isUndefined(x) { return x == null && x !== null; }
  187. function isString(x) { return (typeof(x)!='object' && typeof(x)!='function'); }
  188. function trimStr(x) { return x.replace(/^\s+|\s+$/g,""); };
  189.  
  190. function _o(m,e,f){Dom.Ev(e,m,function(e){typeof(f)=='function'?f(e):void(0)});}
  191. function gID(x) { return document.getElementById(x) }
  192.  
  193. function addClass(cName, Obj){
  194. if(cName=="") return;
  195. var neocls = (Obj.className ? Obj.className : '');
  196. if(neocls.indexOf(cName)!=-1) return;
  197. neocls+=(neocls!=''?' ':'')+cName;
  198. Obj.setAttribute('class', neocls);
  199. }
  200. function removeClass(cName, Obj){
  201. if(cName=="") return;
  202. var neocls = (Obj.className ? Obj.className : '');
  203. neocls = trimStr ( neocls.replace(cName,"") ); // replace and trim
  204. Obj.setAttribute('class', neocls);
  205. }
  206. function SimulateMouse(elem,event,preventDef) {
  207. if(typeof(elem)!='object') return;
  208. var evObj = document.createEvent('MouseEvents');
  209. preventDef=(isDefined(preventDef) && preventDef ? true : false);
  210. evObj.initEvent(event, preventDef, true);
  211. try{elem.dispatchEvent(evObj);}
  212. catch(e){}
  213. }
  214. function createEl(type, attrArray, html){
  215. var node = document.createElement(type);
  216. for (var attr in attrArray)
  217. if (attrArray.hasOwnProperty(attr))
  218. node.setAttribute(attr, attrArray[attr]);
  219. if(html) node.innerHTML = html;
  220. return node;
  221. }
  222.  
  223. // Get Elements
  224. var $D=function (q, root, single) {
  225. if (root && typeof root == 'string') {
  226. root = $D(root, null, true);
  227. if (!root) { return null; }
  228. }
  229. if( !q ) return false;
  230. if ( typeof q == 'object') return q;
  231. root = root || document;
  232. if (q[0]=='/' || (q[0]=='.' && q[1]=='/')) {
  233. if (single) { return document.evaluate(q, root, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; }
  234. return document.evaluate(q, root, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  235. }
  236. else if (q[0]=='.') { return root.getElementsByClassName(q.substr(1)); }
  237. else { return root.getElementById( (q[0]=='#' ? q.substr(1):q.substr(0)) ); }
  238. return root.getElementsByTagName(q);
  239. };
  240. // utk add - remove element
  241. var Dom = {
  242. g: function(el) {
  243. if(!el) return false;
  244. return ( isString(el) ? document.getElementById(el) : el );
  245. },
  246. add: function(el, dest) {
  247. var el = this.g(el);
  248. var dest = this.g(dest);
  249. if(el && dest) dest.appendChild(el);
  250. },
  251. remove: function(el) {
  252. var el = this.g(el);
  253. if(el && el.parentNode)
  254. el.parentNode.removeChild(el);
  255. },
  256. Ev: function() {
  257. if (window.addEventListener) {
  258. return function(el, type, fn, ph) {
  259. if(typeof(el)=='object')
  260. this.g(el).addEventListener(type, function(e){fn(e);}, (isUndefined(ph) ? false : ph));
  261. };
  262. }else if (window.attachEvent) {
  263. return function(el, type, fn) {
  264. var f = function() { fn.call(this.g(el), window.event); };
  265. this.g(el).attachEvent('on' + type, f);
  266. };
  267. }
  268. }()
  269. };
  270.  
  271. var _TEXT = {
  272. e : null, eNat : null,
  273. content : "",
  274. cursorPos : [],
  275. last_scrollTop: 0,
  276. init: function() {
  277. this.eNat = gID(gvar.tID);
  278. this.content = this.eNat.value;
  279. this.cursorPos = _TEXT.rearmPos(); // [start, end]
  280. this.last_scrollTop = gID(gvar.tID).scrollTop; // last scrolltop pos
  281. return this;
  282. },
  283. rearmPos: function(){ return [this.getCaretPos(), gID(gvar.tID).selectionEnd]; },
  284. subStr: function(start, end){ return this.content.substring(start, end);},
  285. set: function(value){
  286. gID(gvar.tID).value = this.content = value;
  287. _TEXT.setRows_Elastic();
  288. _TEXT.init();
  289.  
  290. },
  291. wrapValue : function(tag, title){
  292. var st2, start=this.cursorPos[0], end=this.cursorPos[1],bufValue;
  293. tag = tag.toUpperCase();
  294. bufValue = this.subStr(0, start) +
  295. '['+tag+(title?'='+title:'')+']' +
  296. (start==end ? '' : this.subStr(start, end)) +
  297. '[/'+tag+']' + this.subStr(end, this.content.length);
  298. this.set(bufValue);
  299. st2 = (start + ('['+tag+(title?'='+title:'')+']').length);
  300. this.setCaretPos( st2, st2 + this.subStr(start, end).length );
  301. if(this.overflow!='hidden') gID(gvar.tID).scrollTop = (this.last_scrollTop+1);
  302. return bufValue;
  303. },
  304. add: function(text){ // used on fetch post only
  305. var newline = '\n\n';
  306. if( gID(gvar.tID).value != "" )
  307. this.content+= newline;
  308. gID(gvar.tID).value = ( this.content + text );
  309. setTimeout(function(){
  310. _TEXT.lastfocus();
  311. }, 200);
  312. },
  313. // ptpos stand to puretext position [start, end]
  314. setValue : function(text, ptpos){
  315. var start=this.cursorPos[0], end=this.cursorPos[1];
  316. if(isUndefined(ptpos)) ptpos=[text.length,text.length];
  317. if(start!=end) {
  318. this.replaceSelected(text,ptpos);
  319. return;
  320. }
  321. var bufValue = this.subStr(0, start) + text + this.subStr(start, this.content.length);
  322. this.set(bufValue);
  323. // fix chrome weird
  324. this.setCaretPos( (start + ptpos[0]), (start+ptpos[1]) );
  325. if(_TEXT.overflow!='hidden') gID(gvar.tID).scrollTop = (this.last_scrollTop+1);
  326. return bufValue;
  327. },
  328. replaceSelected : function(text, ptpos){
  329. var start=this.cursorPos[0], end=this.cursorPos[1];
  330. if(start==end) return;
  331. var bufValue = this.subStr(0, start) + text + this.subStr(end, this.content.length);
  332. this.set(bufValue);
  333. this.setCaretPos( (start + ptpos[0]), (start+ptpos[1]) );
  334. if( _TEXT.overflow!='hidden') gID(gvar.tID).scrollTop = (this.last_scrollTop+1);
  335. },
  336. pracheck: function(foc){
  337. if( isUndefined(foc) )
  338. foc = true;
  339. _TEXT.setElastic(gvar.maxH_editor);
  340. if( gID(gvar.tID).value !="" )
  341. gID('clear_text').style.setProperty('display', 'block');
  342. else
  343. gID('clear_text').style.setProperty('display', 'none');
  344. if(foc) setTimeout(function(){
  345. _TEXT.focus();
  346. }, 200);
  347. },
  348. focus: function(){
  349. gID(gvar.tID).focus()
  350. },
  351. lastfocus: function (){
  352. var eText, nl, pos, txt = String(gID(gvar.tID).value); // use the actual content
  353. pos = txt.length;
  354. nl = txt.split('\n');
  355. nl = nl.length;
  356. pos+= (nl * 2);
  357. eText = gID(gvar.tID);
  358. if( eText.setSelectionRange ) {
  359. _TEXT.focus();
  360. eText.setSelectionRange(pos,pos);
  361. }
  362. setTimeout(function(){ _TEXT.focus() } , 310);
  363. },
  364. getSelectedText : function() {
  365. return (this.cursorPos[0]==this.cursorPos[1]? '': this.subStr(this.cursorPos[0], this.cursorPos[1]) );
  366. },
  367. getCaretPos : function() {
  368. var CaretPos = 0;
  369. //Mozilla/Firefox/Netscape 7+ support
  370. if(gID(gvar.tID))
  371. if (gID(gvar.tID).selectionStart || gID(gvar.tID).selectionStart == '0')
  372. CaretPos = gID(gvar.tID).selectionStart;
  373. return CaretPos;
  374. },
  375. setCaretPos : function (pos,end){
  376. if(isUndefined(end)) end = pos;
  377. if(gID(gvar.tID).setSelectionRange) { // Firefox, Opera and Safari
  378. this.focus();
  379. gID(gvar.tID).setSelectionRange(pos,end);
  380. }
  381. },
  382. setElastic: function(max,winrez){
  383. var a, tid=gvar.tID;
  384. function setCols_Elastic(max){
  385. var a=gID(tid); a.setAttribute("cols", Math.floor(a.clientWidth/7));
  386. var w = Math.floor(a.clientWidth/7);
  387. _TEXT.setRows_Elastic(max)
  388. }
  389. a= gID(tid) || gID(gvar.tID);
  390. _TEXT.oflow='hidden';
  391. a.setAttribute('style','visibility:hidden; overflow:'+_TEXT.oflow+';letter-spacing:0;line-height:14pt;'+(max?'max-height:'+(max-130)+'pt;':''));
  392. if( !winrez ) gID(gvar.tID).keyup(function(){ setCols_Elastic(max) });
  393. setCols_Elastic(max);
  394. },
  395. setRows_Elastic: function(max){
  396. var a = gID(gvar.tID), c=a.cols, b=a.value.toString(), h;
  397. b=b.replace(/(?:\r\n|\r|\n)/g,"\n");
  398. for(var d=2,e=0,f=0;f<b.length;f++){
  399. var g=b.charAt(f);e++;if(g=="\n"||e==c){d++;e=0}
  400. }
  401. h=(d*14); a.setAttribute("rows",d); a.style.height=h+"pt";
  402. _TEXT.oflow = (max && (d*14>(max-130)) ? 'auto':'hidden');
  403. a.style.setProperty('overflow', _TEXT.oflow, 'important');
  404. gID(gvar.tID).style.setProperty('visibility', 'visible');
  405. }
  406. };
  407.  
  408. // ----my ge-debug--------
  409. function show_alert(msg, force) {
  410. if(arguments.callee.counter) { arguments.callee.counter++; } else { arguments.callee.counter=1; }
  411. GM_log('('+arguments.callee.counter+') '+msg);
  412. if(force==0) { return; }
  413. }
  414. function clog(msg) {
  415. if(!gvar.__DEBUG__) return;
  416. show_alert(msg);
  417. }
  418.  
  419.  
  420.  
  421. // main resource
  422. var rSRC = {
  423. getSetOf: function(type){
  424. if(isUndefined(type)) return false;
  425. switch(type){
  426. case "button":
  427. return {
  428. rainbow_gif : ""
  429. +"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACx"
  430. +"MBAJqcGAAAAAd0SU1FB9sICxUyJwHLCg0AAALJSURBVDjL7ZRLa5x1HIWf/+WdeeeamaTjaNJKMl5DI1p6QWu76EaqQlFQqEgW4gUXbnTryg8gfgAF+wXciyAUC11oSE"
  431. +"K0iNpLyCSZTseZziTv5J339v+5cSMEcVvwLA+HZ3HgHPhfD54EdBsK25D/L3l1mLmuqDmhlcEjDo4K1IBMw58K7gK7RcXt40Lwr8ArBvtsxmMOLgic10XmpERLeTRwJB"
  432. +"LTIaQtIVsKrir4YQzt85AdClyFU6L4CM1lXUH5Z9j0T1MyTeqSEKVt+vEGTFaZzfYRMq4o+HINNt4D+QdwFV7L4BMzxcnyy+zPLGN5CEmK2iRGFRWkNpHQHjjULrr3Nc"
  433. +"H4expuzDULX5yAbwHs3509ngjv5lucrL9BWrqE6jZsekNp19MxByBaIQWr02Y+ny1VM9P8OLXDeZLRN7wY77C9An+cgltmFfIpfGoqXKy9jvGX9d6dWU9fj03xt7gedO"
  434. +"4/H/WHZ3KDvaV4ENdHfT2S+zqtFRsmbSy4MR0KyRYPuwh5x+OaeR8Wgc/L5yhOLbO/84QxV0dF9Xs0p9zgorPdN5XpX8jb0Wmno1Y2wea7ZqiDLJK5ZkbVd2F6m6PJNt"
  435. +"Oe4zvzAbxlyrw08zbx5Jx2a2JKG2HD+d3L99j6sBGOquW9YWQnY6wOFyre+Kw12m31K79Ml1TsNY9Imrsr3uQGGTG3LPCCV8d4TxLfrEi0OSxgxieM9F49FgTDbH395+"
  436. +"7Ozm4OlFtYeDRZeubpqfLgladUdaV3U/9oj83E8ew8oa0zFQWctQJHVJE7apooyomEScnqsKV10tSbmyuD3r2+yjK5DlLudLrHy5Vy+7npxWYaLAbj0pqX5CUzDTVSBf"
  437. +"GBhgW+Uhat8so5I8qJVaRVFD6D/uAgjhOdy/m/An4YTuYHg5HTyiuT1jKH1mIQ5Su0J0ZBwE+g5bPDJ3j4NKvqwX6nvwCqwTnwEVQ78QAAAABJRU5ErkJggg=="
  438.  
  439. };
  440. break;
  441. }
  442. }
  443.  
  444. };
  445. // -end static
  446. //=========
  447.  
  448. function init(){
  449. gvar.qr_identity= 'qr_plugins_container';
  450. gvar.try_wait = 0;
  451. gvar.try_max = 20;
  452. gvar.sITry_wait= null;
  453.  
  454. wait_for_qr();
  455. }
  456.  
  457. // make sure QR DOM is finished loaded
  458. function wait_for_qr(){
  459. if( gvar.try_wait<gvar.try_max ){
  460. if( !gID(gvar.qr_identity) ){
  461. clog('waiting..');
  462. gvar.try_wait++;
  463. gvar.sITry_wait = window.setTimeout(function() { wait_for_qr() }, 500);
  464. }else{
  465. clearTimeout( gvar.sITry_wait );
  466. init_start();
  467. }
  468. }
  469. }
  470.  
  471. // ------
  472. init();
  473. // ------
  474.  
  475. })()
  476. /* Mod By Idx. */

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址