Input Reolacer

批量替换输入框中文字。

目前為 2020-09-19 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        Input Reolacer
// @namespace   Input Reolacer
// @match       *://*/*
// @grant       GM_addStyle
// @grant       GM_registerMenuCommand
// @version     1.0.0
// @author      稻米鼠
// @created     2020/9/19 下午1:12:20
// @update      2020/9/19 下午1:12:20
// @description 批量替换输入框中文字。
// ==/UserScript==

GM_addStyle(`
#input-replacer-userscript-panel {
  position: fixed;
  top: -10px;
  left: -10px;
  box-sizing: border-box;
  width: calc(100vw + 20px);
  height: calc(100vh + 20px);
  padding: 30px 0;
  font-size: 18px;
  /* display: none; */
}
#input-replacer-userscript-panel * {
  box-sizing: border-box;
  font-size: 18px;
  line-height: 1.6em;
}
#input-replacer-userscript-panel.input-replacer-mask {
  background: rgba(0, 0, 0, .6);
}
#input-replacer-userscript-panel.input-replacer-show {
  display: block;
}
#input-replacer-userscript-panel.input-replacer-hide {
  display: none;
}
#input-replacer-userscript-panel > .input-replacer-panel {
  position: relative;
  width: 92%;
  max-width: 800px;
  max-height: calc(100vh - 40px);
  padding: 30px;
  margin: 0 auto;
  border-radius: 6px;
  box-shadow: 0 12px 36px rgba(0, 0, 0, .6);
  background: #FFF;
}
#input-replacer-userscript-panel > .input-replacer-panel > .input-replacer-panel-close {
  position: absolute;
  top: 10px;
  right: 10px;
  color: #666;
  text-align: right;
  cursor: pointer;
}
#input-replacer-userscript-panel > .input-replacer-panel > .input-replacer-panel-header {

}
#input-replacer-userscript-panel > .input-replacer-panel > .input-replacer-panel-header > h2 {
  text-align: center;
  font-size: 36px;
  color: black;
}
#input-replacer-userscript-panel > .input-replacer-panel > .input-replacer-panel-header > p {
  text-align: center;
  color: #666;
}
#input-replacer-userscript-panel > .input-replacer-panel > .input-replacer-input-group > label,
#input-replacer-userscript-panel > .input-replacer-panel > .input-replacer-input-group > input {
  display: block;
}
#input-replacer-userscript-panel > .input-replacer-panel > .input-replacer-input-group > input {
  color: #666;
  width: 100%;
  padding: 8px;
  margin-bottom: 10px;
}
#input-replacer-userscript-panel > .input-replacer-panel > div > button {
  display: block;
  width: 100%;
  color: white;
  background: #04ABFF;
  width: 100%;
  padding: 8px;
  margin-bottom: 10px;
  test-align: center;
  border: none;
  border-raduis: 3px;
}
`)
let panelObj
/**
 * 获取页面中最大的 z-index,并加 1
 *
 * @return {*} 最大 z-index
 */
const maxZIndex = ()=>{
  let zIndex = 0
  document.body.querySelectorAll('*').forEach(el=>{
    if(!isNaN(window.getComputedStyle(el).zIndex)){
      const newZ = +window.getComputedStyle(el).zIndex
      zIndex = zIndex > newZ ? zIndex : newZ
    }
  })
  return zIndex+1
}
const replaceAllInput = e=>{
  const input0 = panelObj.panel.querySelector('#input-replacer-input-group-0').value
  const input1 = panelObj.panel.querySelector('#input-replacer-input-group-1').value
  if(/^\/.*\/[a-z]*$/.test(input0)){
    const regContent = input0.replace(/^\//, '').replace(/\/[a-z]*/, '').replace(/\\/g, '\\')
    const regFlag = input0.replace(/^\/.*\/([a-z]*)$/, '$1')
    const reg = new RegExp(regContent, regFlag)
    document.body.querySelectorAll('input[type=text], input[type=email], input[type=number], input[type=url], textarea').forEach(el=>{
      el.value = el.value.replace(reg, input1)
    })
  }else{
    document.body.querySelectorAll('input[type=text], input[type=email], input[type=number], input[type=url], textarea').forEach(el=>{
      el.value = el.value.replaceAll(input0, input1)
    })
  }
  panelObj.panel.classList.add('input-replacer-hide')
}
const addPanel = ()=> {
  // 创建容器
  const container = document.createElement('div')
  container.id = 'input-replacer-userscript-panel'
  container.classList.add('input-replacer-mask')
  container.style = 'z-index: '+maxZIndex()+';'
  // 添加面板
  const panel = document.createElement('div')
  panel.classList.add('input-replacer-panel')
  container.appendChild(panel)
  // 注入关闭按钮
  const closeButton = document.createElement('div')
  closeButton.classList.add('input-replacer-panel-close')
  closeButton.innerText = 'Close'
  closeButton.onclick = ()=>{
    if(confirm('确认关闭?')){
      container.classList.add('input-replacer-hide')
    }
  }
  panel.appendChild(closeButton)
  // 注入标题和描述
  const panelHeader = document.createElement('div')
  panelHeader.classList.add('input-replacer-panel-header')
  panelHeader.innerHTML = `
  <h2>输入框查找替换</h2>
  <p>对页面中所有输入框和文本域的内容进行批量替换。</p>
  `
  panel.appendChild(panelHeader)
  // 设置输入框组
  const inputNameGroup = ['要查找的内容(支持正则表达式)', '要替换为的内容(支持 $1、$2……替代分组)']
  for(const name of inputNameGroup){
    const inputGroup = document.createElement('div')
    inputGroup.classList.add('input-replacer-input-group')
    inputGroup.innerHTML = `
    <label for="input-replacer-input-group-`+ inputNameGroup.indexOf(name) +`">`+ name +`</label>
    <input id="input-replacer-input-group-`+ inputNameGroup.indexOf(name) +`">
    `
    // inputGroup.querySelector('input').addEventListener('keyup', inputChange)
    panel.appendChild(inputGroup)
  }
  // 注入替换按钮
  const buttonArea = document.createElement('div')
  buttonArea.innerHTML = `
  <button>替换全部</button>
  `
  buttonArea.querySelector('button').addEventListener('click', replaceAllInput)
  panel.appendChild(buttonArea)
  // 注入预览区
  const previwArea = document.createElement('div')
  previwArea.id = 'input-replacer-preview'
  panel.appendChild(previwArea)
  // 向页面注入容器
  document.body.appendChild(container)
  return {
    panel: container,
    previwArea
  }
}

GM_registerMenuCommand('测试', ()=>{
  if(panelObj){
    panelObj.panel.classList.remove('input-replacer-hide')
  }else{
    panelObj = addPanel()
  }
})