<meta charset="UTF-8" />
<style>
pre,
body,
html {
margin: 0;
padding: 0;
}
body {
display: flex;
flex-direction: column;
height: 100vh;
margin: 0;
padding: 0 5px;
}
#main {
flex: 1;
padding: 0 5px;
}
.modal {
display: none;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: #f9f9f9;
padding: 20px;
border: 1px solid #ccc;
text-align: center;
}
.modal-content {
display: flex;
align-items: center;
align-content: baseline;
flex-wrap: wrap;
width: 70vw;
max-height: 70vw;
min-height: 100px;
overflow: auto;
}
.modal-content button {
margin: 2px;
display: inline-block;
color: #FFF;
}
</style>
<div style="padding:5px">
<button onclick="toggle('')">Toggle</button>
<button onclick="toggleSide('')">贴边</button>
<button onclick="base(1)">基座</button>
<button onclick="base(0)">测试</button>
<button onclick="takeColor()" title="可按Alt+C进行取色">取色</button>
<button onclick="runBat('mspaint')">画板</button>
<button onclick="runBat('calc')">计算器</button>
<button onclick="runBat('control')">控制面板</button>
<button onclick="runBat('SystemPropertiesAdvanced')">环境设定</button>
<button onclick="runBat('taskmgr')">任务管理</button>
<button onclick="runBat('regedit')">注册表</button>
<button onclick="runBat('rundll32.exe powrprof.dll,SetSuspendState Hibernate')">sleep</button>
</div>
<pre id="main" contenteditable="false" style="line-height: 15px;cursor: pointer;">
http://www.baidu.com
document.designMode='on'
</pre>
<div class="modal">
<div class="modal-content">
<button onclick="closeModal()">关闭</button>
</div>
</div>
<script>
var file = "wz.tool.note.md"
var main = document.getElementById('main')
var modal = document.getElementsByClassName('modal')[0];
var content = document.getElementsByClassName('modal-content')[0];
async function getPath(file) {
var { document } = await Niva.api.os.dirs();
return document + "/" + file;
}
function commonFetch(path, data) {
return new Promise((resolve, reject) => {
fetch('http://127.0.0.1:1001' + path, {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
}).then(response => {
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
return response.json();
}).then(data => resolve(data)).catch(error => reject(error));
});
}
async function runBat(cmd) {
commonFetch("/api/cmd", { cmd })
}
async function base(f) {
if (f) {
Niva.api.process.exec("Common.exe")
} else {
Niva.api.process.open("http://127.0.0.1:1001/api/color")
}
}
async function toggle() {
main.contentEditable = main.contentEditable === 'true' ? 'false' : 'true';
Niva.api.fs.write(await getPath(file), main.innerText)
}
async function toggleSide() {
Niva.api.window.setOuterPosition({ x: window.screen.width * 0.9, y: window.screen.height * 0.1 });
}
async function closeModal() {
modal.style.display = 'none';
}
async function callTakeColor() {
var res = await commonFetch("/api/color", {})
var copyButton = document.createElement('button');
var color = '#' + res.rgba.map(value => { const hex = value.toString(16); return hex.length === 1 ? '0' + hex : hex; }).join('');
navigator.clipboard.writeText(color)
copyButton.innerText = color;
copyButton.style.backgroundColor = `rgba(${res.rgba.join(",")})`;
copyButton.addEventListener('click', function () {
navigator.clipboard.writeText(color)
});
content.appendChild(copyButton);
}
async function takeColor() {
var { display } = modal.style
if (display == 'block') {
clearInterval(window.time)
} else {
modal.style.display = 'block';
window.time = setInterval(async () => { callTakeColor() }, 1000)
}
}
window.onload = async () => {
main.addEventListener('click', function (event) {
var line = main.innerText.split('\n')[Math.floor(event.offsetY / 15)].trim()
if (main.contentEditable == 'true') return;
if (line.startsWith("D:\\") || line.startsWith("C:\\")) return commonFetch("/api/cmd", { cmd: 'code ' + line })
Niva.api.clipboard.write(line)
Niva.api.process.open(line.startsWith('http') ? line : 'https://www.baidu.com/s?wd=' + encodeURIComponent(line));
})
main.innerText = await Niva.api.fs.read(await getPath(file), "utf8") || '';// 读取文件设置内容 文件不存在就报错没有关系了
}
document.addEventListener('keydown', function (event) {
if (event.altKey && event.key === 'c') callTakeColor()
});
</script>
niva.json
{
"name": "wzskyline",
"uuid": "d35b4408-b64e-4978-9b56-a80ff4b152d8",
"visible": false,
"icon": "icon.png",
"activation": "accessory",
"window": {
"visible": true,
"alwaysOnTop": true,
"visibleOnAllWorkspaces": false,
"decorations": false,
"transparent": false,
"icon": "icon.png",
"size": {
"width": 800,
"height": 800
},
"menu": [
]
},
"shortcuts": [
{"id": 1, "accelerator": "CommandOrControl+Shift+Backslash"}
],
"macos": {
"window": {
"title": "MacOS",
"decorations": true
}
},
"windows": {
"window": {
"title": "wzskyline",
"decorations": true
}
}
}