uTools-quickcommand/public/helps/quickcommand.md
2022-03-30 09:25:46 +08:00

13 KiB
Raw Blame History

[TOC]

quickcommand

❖ UI 交互

showButtonBox(buttons, title)

  • buttons: Array 每一个元素对应一个按钮
  • title: String | undefined 对话框标题
  • 返回: Promise
    • id: Integer 按钮的序号从0开始
    • text: String 按钮的文本

显示一个按钮对话框,用来接收用户的输入

示例

// then 写法
quickcommand.showButtonBox(["按钮1", "按钮2", "按钮3"]).then(({ id, text }) => {
    console.log(`选择了第${id+1}个按钮`)
    console.log(`按钮的文本为${text}`)
})

// async 写法
(async () =>{
  let button = await quickcommand.showButtonBox(["按钮1", "按钮2", "按钮3"])
  console.log(`选择了第${button.id+1}个按钮`)
  console.log(`按钮的文本为${button.text}`)
})()

// 捕获错误
quickcommand.showButtonBox().catch(e => {
    console.log(e)
})

实例

// 截取自内置快捷命令: 通过 find 查找文件
quickcommand.showButtonBox(['打开文件', '在文件管理器中定位', '复制文件路径']).then(x => {
    switch (x.id) {
        case 0:
            utools.shellOpenItem(file);
            break;
        case 1:
            utools.shellShowItemInFolder(file);
            break;
        case 2:
            utools.copyText(file);
            break;
        default:
            break;
    }
})

showInputBox(placeHolders, title)

  • placeHolders: Array 每一个占位符对应一个输入框
  • title: String | undefined 对话框标题
  • 返回: Promise
    • values: Array 所以输入框的值

显示一个输入框界面,用来接用户的输入

示例

quickcommand.showInputBox(["输入框1", "输入框2", "输入框3"]).then(values => {
    console.log(`输入的内容分别为${values}`)
})

实例

// 截取自内置快捷命令: 文本替换
quickcommand.showInputBox(["要替换的内容,两边加 / 使用正则", "替换为的内容"]).then(inputs => {
    var search = inputs[0]
    var repl = inputs[1]
	...
    utools.hideMainWindow()
    quickcommand.sleep(300)
    quickcommand.simulateCopy()
    quickcommand.sleep(100)
    var source = electron.clipboard.readText()
    source = source.replace(search, repl)
	...
})

showSelectList(selects, options)

  • selects: Array 每一个元素对应一个列表选项
  • options: Object | undefined 列表的选项
    • placeholder: String 搜索框占位符
    • optionType: String 选项的格式,有plaintexthtmljson三种,默认为plaintext
  • 返回: Promise
    • id: Integer 选择的序号从0开始
    • text: String 选择的文本
    • title/description/[…]: 当optionTypejson时,对应json里的每一个属性

显示一个支持搜索的且可以动态更新的选项列表

当指定optionTypejson时,类似于插件开发的列表模式titledescriptionicon分别表示标题、描述和图标,其中title为必备属性

示例

// plaintext
var opt = []
for (var i = 0; i < 15; i++) {
    // 每一个选项为文本格式
    opt.push(`选项` + i)
}
quickcommand.showSelectList(opt).then(choise => {
    console.log(`选择的选项为${choise.text}`)
})

// json
var opt = []
for (var i = 0; i < 15; i++) {
    // 每一个选项为 json 格式
    opt.push({title: `选项${i}`, description: `选项${i}的描述`, abcd: `选项${i}的自定义属性`})
}
quickcommand.showSelectList(opt, {optionType: 'json'}).then(choise => {
    console.log(`选择的选项为${choise.title}`)
})

// html
var opt = []
for (var i = 0; i < 15; i++) {
    // 每一个选项为 html 格式
    opt.push(`<div style="color: red">选项${i}</div>`)
}
quickcommand.showSelectList(opt, {optionType: 'html'}).then(choise => {
    console.log(`选择的选项为${quickcommand.htmlParse(choise.text).body.innerText}`)
})

实例

// 截取自内置快捷命令: 文本处理
let textManipulation = [ ... ]
let text = quickcommand.payload
let options = textManipulation.map(t => {
    return {
        title: t.name,
        description: t.func(text)
    }
})

quickcommand.showSelectList(options, { optionType: 'json' })
    .then(choise => {
        console.log(choise.description)
        utools.copyText(choise.description)
    })

axios.post('http://fy.iciba.com/ajax.php?a=fy', `f=auto&t=auto&w=${text}`)
    .then(res => {
        let content = res.data.content
        let trans = content.out ? content.out : content.word_mean
        let opt = textManipulation[0]
        opt.description = trans
        quickcommand.updateSelectList(opt, 0)
    })   

updateSelectList(opt, id)

  • opt: String 要更新的选项
  • id: Integer | undefined: 要更新的选项的序号,不赋值时则追加到最后一个选项后面

动态更新当前的选项列表的选项。

示例

// 初始状态只有 1、2、3 三个选项
quickcommand.showSelectList(['1','2','3']).then(x=>{
  console.log(x)
})

// 1s 后追加一个选项
quickcommand.setTimeout(()=>{
  quickcommand.updateSelectList('4')
}, 1000)

// 2s 后更新第二个选项的值
quickcommand.setTimeout(()=>{
  quickcommand.updateSelectList('updated', 1)
}, 2000)

showTextAera(placeholder, value)

  • placeholder: String | undefined 文本框占位符
  • value: String | undefined 默认的文本值
  • 返回: Promise
    • text: String 文本框的文本

显示一个文本框界面,用来接用户的输入

示例

quickcommand.showTextAera("请输入文本").then(text=>{
  console.log(`输入的文本为${text}`)
})

实例

// 截取自内置快捷命令: vscode代码片段生成器
var snippet = {}
quickcommand.showTextAera("请输入代码片段").then(code => {
    snippet.body = code.split("\n")
    quickcommand.showInputBox(["代码片段的描述", "触发代码片段的关键词"])
        .then(inputs => {
            snippet.prefix = inputs[1]
            snippet.description = inputs[0]
            var result = `"${inputs[0]}": ` + JSON.stringify(snippet, null, '\t')
            console.log(result)
            utools.copyText(result)
            quickcommand.showMessageBox('已复制')
        })
})

showMessageBox(message, icon, time)

  • message: String 显示的消息内容
  • icon: String | undefined 图标,可为successerrorwarninginfoquestion,默认为success
  • time: Integer | undefined 多少毫秒后消失,默认为3000

显示一个自动消失的提示框

示例

quickcommand.showMessageBox("这是一段3s后自动消失的成功提示")
quickcommand.showMessageBox("这是一段3s后自动消失的失败提示", "error")

showConfirmBox(title)

  • title: String | undefined 提示的标题
  • 返回: Promise
    • confirmed: Boolean | undefined 是否点击了确定按钮

显示一个确认框

quickcommand.showConfirmBox().then(confirmed => {
    confirmed && console.log('点击了确定')
})

❖ 延时函数

sleep(ms)

  • ms: Integer 等待的毫秒

由于setTimeout在electron中存在限制在隐藏到后台时不会被执行在vm2中也有bug所以在quickcommand的环境下被禁用了但对于模拟按键之类的场景延迟是不可缺少的所以提供了sleep函数来解决这个问题

示例

utools.simulateKeyboardTap('d', 'alt')
quickcommand.sleep(200)
utools.simulateKeyboardTap('c', 'ctrl')

setTimeout(callback, ms)

  • callback: Function 回调函数
  • ms: Integer 延时的毫秒

用法和setTimeout一样,但实现原理不一样,sleep的异步版本

示例

quickcommand.setTimeout(()=>{
  console.log('2000毫秒后执行')
}, 2000)

❖ 前端封装

htmlParse(html)

  • html: String 需要解析的html文本
  • 返回: Object DOM对象

将给定的html字符串解析为DOM对象,用于快速编写爬虫脚本

示例

var html = `<a href="https://u.tools/">uTools</a>`
var href = quickcommand.htmlParse(html).querySelector('a').href
console.log(`解析出来的a标签地址为${href}`)

downloadFile(url, file | options)

  • url: String 地址
  • file | options :
    • file: String 当赋值为文件路径时,则表示下载文件的绝对路径
    • options: Object | undefined 不赋值时,则会弹出对话框要求选择下载到的路径, 赋值为 Object 时,表示弹出对话框的 options ,格式和 utools.showSaveDialog 中的 options 一致
  • 返回: Promise
    • content: Buffer 文件的内容

下载文件,可选直接下载到指定路径,或者弹出对话框选择下载路径

// 下载文件到D:/
quickcommand.downloadFile('https://res.u-tools.cn/currentversion/uTools-1.1.3.exe', 'D:/')

// 下载文件,并弹出对话框询问保存路径
quickcommand.downloadFile('https://res.u-tools.cn/currentversion/uTools-1.1.3.exe')

uploadFile(url, file | options, name, formData)

  • url: String 地址
  • file | options :
    • file: String 当赋值为文件路径时,则表示要上传的文件的绝对路径
    • options: Object | undefined 不赋值时,则会弹出对话框要求选择要上传的文件的路径, 赋值为 Object 时,表示弹出对话框的 options ,格式和 utools.showOpenDialog 中的 options 一致
  • name: String | undefined 文件名,默认为file
  • formData: Object | undefined 其他需要添加的表单数据
  • 返回: Promise
    • response: Object 响应内容

上传文件,可以直接上传指定文件,或者弹出对话框选择要上传的文件,可以自定义表单数据

// 上传图片到图床
quickcommand.uploadFile("https://imgkr.com/api/v2/files/upload", "C:\\test.jpg").then(res=>{
  console.log('上传成功,图片地址为:' + res.data.data)
})

// 包含额外表单数据
quickcommand.uploadFile("https://catbox.moe/user/api.php", "C:\\test.jpg", 'fileToUpload', {
  "reqtype": "fileupload"
}).then(res=>{
  console.log('上传成功,图片地址为:' + res.data)
})

❖ nodejs 封装

loadRemoteScript(url)

  • url: String 脚本地址

  • 返回: Promise

    • Object: Object 返回从远程脚本加载的对象

加载一个远程脚本文件

let remote = 'https://cdn.jsdelivr.net/npm/sweetalert2@9'
quickcommand.loadRemoteScript(remote).then(swal => {
    swal.fire('已加载 sweetalert2 并成功弹窗')
})

// async/await
(async () => {
    let remote = 'https://cdn.jsdelivr.net/npm/sweetalert2@9'
    const swal = await quickcommand.loadRemoteScript(remote)
    swal.fire('已加载 sweetalert2 并成功弹窗')
})()

kill(pid, signal)

  • pid: Integer 进程 ID
  • signal: String | Integer | undefined 将发送的信号,默认为 'SIGTERM'

signal 发送给 pid 标识的进程 , 默认为关闭进程,同process.kill

示例

quickcommand.kill(16084)

runVbs(script)

  • script: String VBS代码
  • 返回: Promise
    • Result: String 脚本运行结果

windows 下运行 VBS 脚本

示例

quickcommand.runVbs(`CreateObject("SAPI.SpVoice").Speak"Hello"`)

❖ utools 封装

enterData

  • Object 对应utools.onPluginEntercode typepayload
    • code: String 唯一标示
    • type: 匹配模式,可以为 text img files regex over window
    • payload: 当匹配模式为关键字时,返回进入插件的关键字;为正则时,返回匹配的文本;为窗口时,返回匹配的窗口信息;为文件时,返回匹配的文件信息

示例

// 匹配模式为正则/划词时
if (quickcommand.enterData.type == 'regex'){
  var text = quickcommand.enterData.payload
	console.log(`主输入框匹配的文本为${text}`)
}

simulateCopy()

模拟复制操作

simulatePaste()

模拟粘贴操作

其他

nodejs

❖ 文档

❖ 上下文

  • require: ƒ require(path)
  • os: {arch: ƒ, cpus: ƒ, endianness: ƒ, freemem: ƒ, getPriority: ƒ, …}
  • fs: {appendFile: ƒ, appendFileSync: ƒ, access: ƒ, accessSync: ƒ, chown: ƒ, …}
  • path: {resolve: ƒ, normalize: ƒ, isAbsolute: ƒ, join: ƒ, relative: ƒ, …}
  • child_process: {_forkChild: ƒ, ChildProcess: ƒ, exec: ƒ, execFile: ƒ, execFileSync: ƒ, …}
  • util: {_errnoException: ƒ, _exceptionWithHostPort: ƒ, _extend: ƒ, callbackify: ƒ, debuglog: ƒ, …}
  • Buffer: ƒ Buffer(arg, encodingOrOffset, length)
  • process: process {version: "v12.14.1", versions: {…}, arch: "x64", …}
  • TextDecoder: ƒ TextDecoder()
  • TextEncoder: ƒ TextEncoder()
  • URL: ƒ URL()
  • URLSearchParams: ƒ URLSearchParams()
  • axios: ƒ wrap()

electron

❖ 文档

❖ 上下文

  • clipboard: Object
  • contextBridge: Object
  • crashReporter: Object
  • desktopCapturer: Object
  • ipcRenderer: EventEmitter
  • nativeImage: Object
  • shell: Object
  • webFrame: WebFrame

utools

❖ 文档

❖ 上下文

  • all except below
  • db
  • removeFeature
  • setFeature