selection length | 选中计字数

鼠标拖选显示选中字数

  1. // ==UserScript==
  2. // @name selection length | 选中计字数
  3. // @namespace hzhbest
  4. // @description 鼠标拖选显示选中字数
  5. // @include https://*
  6. // @include http://*
  7. // @version 1.3
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. // CONFIG
  13. var _use_alt = true; // true-必须按住Alt才显示;false-直接显示。
  14. // CONFIG
  15. document.addEventListener('mouseup', function(e) {
  16. if (!_use_alt || e.altKey) setTimeout(function(){count(e);},150);
  17. }, false);
  18.  
  19. var tooltip = creaElemIn('div', document.body);
  20. tooltip.id = "sl_tooltip";
  21. var timer, content, overed = false;
  22. var timeout = 1000;
  23. // Insert CSS
  24. var headID = document.getElementsByTagName('head')[0];
  25. var cssNode = creaElemIn('style', headID);
  26. cssNode.type = 'text/css';
  27. cssNode.innerHTML = `
  28. #sl_tooltip {
  29. display: none;
  30. position: fixed;
  31. z-index: 999999;
  32. font-size: 12pt;
  33. background: white;
  34. border: 1px solid #eee;
  35. box-shadow: 0 1px 12px #3332;
  36. }
  37.  
  38. #sl_tooltip.show {
  39. display: block;
  40. padding: 0.2em 0.3em;
  41. border-radius:0.3em;
  42. }
  43.  
  44. #sl_tooltip table {
  45. line-height: 15 pt;
  46. border-collapse: collapse;
  47. border-spacing: 0;
  48. font-size: 10pt;
  49. }
  50.  
  51. #sl_tooltip .subT{
  52. border-top: 0.4em solid white;
  53. }`;
  54.  
  55.  
  56. function count(e) {
  57. if (overed) return;
  58. var ae = document.activeElement; //console.log(ae.value + "|" + ae.selectionStart + "|" + ae.selectionEnd);
  59. if (ae.tagName.toLowerCase() == "input" || ae.tagName.toLowerCase() == "textarea") {
  60. content = ae.value.substring(ae.selectionStart, ae.selectionEnd);
  61. } else {
  62. content = getSelection().toString();
  63. }
  64. var selCount = content.length;
  65. if (selCount == 0) return;
  66. //借用一字数统计脚本代码
  67. var cvalue=content.replace(/\r\n/g,"\n");
  68. var sarr=cvalue.split("");
  69. var len_total=sarr.length;
  70. var r={
  71. "wd":0, //中英文字数
  72. "nwd":0, //英数词数
  73. "kwd":0, //日文假名
  74. "krd":0, //韩文字
  75. "nb":0, //数字词数
  76. "c":0, //字符数
  77. "cb":0, //非空格字符
  78. "r":0, //回车
  79. "en":0, //英文字母数
  80. "cn":0, //中文字数
  81. "bl":0 //非回车空格
  82. };
  83. var words=cvalue.match(/\w+([’\']\w+)?/g)||[]; //含撇号(如I'm)的单词视为一个词
  84. var numbers=cvalue.match(/\b\d+(\.\d+)?\b/g)||[]; //含小数点的数字视为一个词
  85. var cnwords=cvalue.match(/[\u4e00-\u9fa5]/g)||[]; //统一中文字范围
  86. var kanawds=cvalue.match(/[\u3040-\u30ff]/g)||[]; //日文假名范围
  87. var krwords=cvalue.match(/[\uac00-\ud7af]/g)||[]; //韩文字范围
  88. r.nwd=words.length;
  89. r.nb=numbers.length;
  90. r.cn=cnwords.length;
  91. r.kwd=kanawds.length;
  92. r.krd=krwords.length;
  93. for(var i=0;i<len_total;i++){
  94. r.c++;
  95. switch(true){
  96. case /[a-zA-Z]/.test(sarr[i]):
  97. r.en++;
  98. break;
  99. case /\S/.test(sarr[i]):
  100. r.cb++;
  101. break;
  102. case /\s/.test(sarr[i]):
  103. if(sarr[i]=="\n"||sarr[i]=="\r"){
  104. r.r++;
  105. }else{
  106. r.bl++;
  107. }
  108. }
  109. }
  110. r.wd=r.nwd+r.cn+r.kwd+r.krd;
  111. var str="字符统计<br/>";
  112. str+="<table border='0' cellpadding='0' cellspacing='0' width='100%'>";
  113. str+="<tr class='subT'><td algin='left'>总字符数:</td><td align='right'> "+(r.c-r.r)+"</td></tr>";
  114. // str+="<tr><td algin='left'>非空白总字符数:</td><td align='right'>"+(r.c-r.bl-r.r)+"</td></tr>";
  115. str+="<tr><td algin='left'> 空白字符:</td><td align='right'> "+r.bl+"</td></tr>";
  116. str+="<tr><td algin='left'> 英文字符:</td><td align='right'> "+r.en+"</td></tr>";
  117. str+="<tr><td algin='left'> 其它字符:</td><td align='right'> "+(r.c-r.en-r.bl-r.cn-r.r)+"</td></tr>";
  118. // str+="<tr><td algin='left'>&nbsp;</td><td align='right'>&nbsp;</td></tr>";
  119. str+="<tr class='subT'><td algin='left'>总字词数:</td><td align='right'> "+r.wd+"</td></tr>";
  120. if(r.cn > 0) str+="<tr><td algin='left'> 中文字:</td><td align='right'> "+r.cn+"</td></tr>";
  121. if(r.kwd > 0) str+="<tr><td algin='left'> 日文假名:</td><td align='right'> "+r.kwd+"</td></tr>";
  122. if(r.krd > 0) str+="<tr><td algin='left'> 韩文字:</td><td align='right'> "+r.krd+"</td></tr>";
  123. if(r.nwd-r.nb > 0)str+="<tr><td algin='left'> 英文单词:</td><td align='right'> "+(r.nwd-r.nb)+"</td></tr>";
  124. if(r.nb > 0) str+="<tr><td algin='left'> 阿拉伯数字:</td><td align='right'> "+r.nb+"</td></tr>";
  125. // str+="<tr><td algin='left'>&nbsp;</td><td align='right'>&nbsp;</td></tr>";
  126. str+="<tr class='subT'><td algin='left'>回行数:</td><td align='right'> "+(r.r+1)+"</td></tr>";
  127. str+="</table>";
  128. tooltip.innerHTML = str;
  129. // tooltip.innerHTML = getSelection().toString(); //for debug
  130. tooltip.className = "show";
  131. tooltip.style.top = Math.min(e.clientY + 10, window.innerHeight - tooltip.offsetHeight - 10) + "px";
  132. tooltip.style.left = Math.min(e.clientX + 20, window.innerWidth - 150) + "px";
  133. function hide(){
  134. tooltip.className = '';
  135. tooltip.removeEventListener('mouseover', over, false);
  136. tooltip.removeEventListener('mouseout', out, false);
  137. }
  138. function over() {
  139. overed = true;
  140. clearTimeout(timer);
  141. }
  142. function out() {
  143. overed = false;
  144. timer = setTimeout(hide, timeout);
  145. }
  146. tooltip.addEventListener('mouseover', over, false);
  147. tooltip.addEventListener('mouseout', out, false);
  148. timer = setTimeout(hide, timeout * 3);
  149. }
  150.  
  151.  
  152. // Create an element
  153. function creaElemIn(tagname, destin) {
  154. var theElem = destin.appendChild(document.createElement(tagname));
  155. return theElem;
  156. }
  157.  
  158.  
  159. })();

QingJ © 2025

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