NewHome/func/codec.html

155 lines
7.2 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="renderer" content="webkit">
<script>(function(){var t;try{t=localStorage.getItem("hp-theme")}catch(e){}if(!t){t=(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches)?"dark":"light"}document.documentElement.setAttribute("data-theme",t);})();</script>
<title>编码 / 加解密</title>
<link rel="icon" href="../assets/img/logo.svg">
<link rel="stylesheet" href="../assets/css/common.css">
</head>
<body>
<div class="func-bar"><div class="wrap func-bar-inner">
<a class="btn btn-sm js-fb-back" href="index.php" title="返回功能区首页">← 返回功能区首页</a>
<span class="func-bar-title">编码 / 加解密</span>
<a class="btn btn-sm" href="../index.php">首页</a>
</div></div>
<main class="page-main">
<div class="wrap page-body">
<div class="panel-card">
<p class="tip" style="margin-top:0">🔒 本页全部运算均在浏览器本地完成粘贴的文本不会上传到任何服务器可放心处理大段内容。MD5 / SHA-224 在无内置加密库时需联网加载组件(仅下载代码,不含你的内容)。</p>
<div class="field-row" style="align-items:center">
<label class="fl" style="margin:0" for="selAlgo">算法</label>
<select id="selAlgo">
<option value="b64">Base64</option>
<option value="b32">Base32</option>
<option value="url">URL 编码</option>
<option value="unicode">Unicode\uXXXX</option>
<option value="md5">MD5不可逆</option>
<option value="sha1">SHA-1不可逆</option>
<option value="sha224">SHA-224不可逆</option>
<option value="sha256">SHA-256不可逆</option>
<option value="sha384">SHA-384不可逆</option>
<option value="sha512">SHA-512不可逆</option>
</select>
<div class="seg" id="dirSeg">
<button type="button" data-dir="enc" class="active">编码</button>
<button type="button" data-dir="dec">解码</button>
</div>
<button type="button" class="btn btn-primary" id="btnRun">执行</button>
<button type="button" class="btn" id="btnSwap" title="把输出内容放入输入区">输出 → 输入</button>
<button type="button" class="btn" id="btnClear">清空</button>
</div>
<div id="msgBox"></div>
</div>
<div class="io-area">
<div class="io-box">
<div class="io-label">
<span>输入区(可编辑)</span>
<button type="button" class="btn btn-sm js-copy" data-target="#inText">复制</button>
</div>
<textarea id="inText" placeholder="在此粘贴或输入要处理的内容…(支持中文 / emoji"></textarea>
</div>
<div class="io-box">
<div class="io-label">
<span>输出区(可编辑)</span>
<button type="button" class="btn btn-sm js-copy" data-target="#outText">复制</button>
</div>
<textarea id="outText" placeholder="结果输出到这里,可手动修改后再次使用"></textarea>
</div>
</div>
</div>
</main>
<button type="button" class="theme-fab js-theme-btn" title="切换昼夜模式" aria-label="切换昼夜模式"><span class="js-theme-icon"></span></button>
<button type="button" class="theme-fab to-top js-to-top" title="返回顶部" aria-label="返回顶部"></button>
<script src="../assets/js/common.js"></script>
<script src="../assets/js/codec.js"></script>
<script>
(function () {
'use strict';
var HASH_ALGOS = { md5: 'MD5', sha1: 'SHA-1', sha224: 'SHA-224', sha256: 'SHA-256', sha384: 'SHA-384', sha512: 'SHA-512' };
var algo = document.getElementById('selAlgo');
var dirButtons = Array.prototype.slice.call(document.querySelectorAll('#dirSeg button'));
var inText = document.getElementById('inText');
var outText = document.getElementById('outText');
var msgBox = document.getElementById('msgBox');
function activeDir() {
var b = dirButtons.filter(function (x) { return x.classList.contains('active'); })[0];
return b ? b.getAttribute('data-dir') : 'enc';
}
function setMsg(text, isErr) {
msgBox.innerHTML = text
? '<div class="' + (isErr ? 'err-msg' : 'ok-msg') + '">' + text + '</div>'
: '';
}
function syncDirectionUI() {
var isHash = HASH_ALGOS[algo.value] !== undefined;
dirButtons.forEach(function (b) { b.disabled = isHash; });
if (isHash) dirButtons.forEach(function (b) { b.classList.remove('active'); });
else if (!dirButtons.some(function (x) { return x.classList.contains('active'); })) {
dirButtons[0].classList.add('active');
}
}
function run() {
var text = inText.value;
if (!text) { setMsg('请输入内容', true); inText.focus(); return; }
var key = algo.value;
var dir = activeDir();
var fn = null;
if (key === 'b64') fn = dir === 'enc' ? function (t) { return CodecLib.b64Encode(t); } : function (t) { return CodecLib.b64Decode(t); };
else if (key === 'b32') fn = dir === 'enc' ? function (t) { return CodecLib.base32Encode(t); } : function (t) { return CodecLib.base32Decode(t); };
else if (key === 'url') fn = dir === 'enc' ? function (t) { return CodecLib.urlEncode(t); } : function (t) { return CodecLib.urlDecode(t); };
else if (key === 'unicode') fn = dir === 'enc' ? function (t) { return CodecLib.unicodeEncode(t); } : function (t) { return CodecLib.unicodeDecode(t); };
if (fn) {
try {
outText.value = fn(text);
setMsg('执行完成', false);
} catch (e) {
setMsg('执行出错:' + (e && e.message ? e.message : e), true);
}
return;
}
var algoName = HASH_ALGOS[key];
if (algoName) {
setMsg('正在计算 ' + algoName + ' …', false);
CodecLib.hashText(algoName, text).then(function (hex) {
outText.value = hex;
setMsg('计算完成(' + algoName + '', false);
}).catch(function (e) {
setMsg('计算失败:' + (e && e.message ? e.message : e), true);
});
} else {
setMsg('未知算法', true);
}
}
algo.addEventListener('change', syncDirectionUI);
dirButtons.forEach(function (b) {
b.addEventListener('click', function () {
if (b.disabled) return;
dirButtons.forEach(function (x) { x.classList.remove('active'); });
b.classList.add('active');
});
});
document.getElementById('btnRun').addEventListener('click', run);
document.getElementById('btnSwap').addEventListener('click', function () {
if (outText.value) { inText.value = outText.value; setMsg('已将输出内容回填到输入区', false); }
});
document.getElementById('btnClear').addEventListener('click', function () {
inText.value = ''; outText.value = ''; setMsg('', false); inText.focus();
});
syncDirectionUI();
})();
</script>
</body>
</html>