原生js手撸乞丐版 vs code

html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<title>手搓vs code</title>
		<link rel="stylesheet"
			href="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/atom-one-dark.min.css" />
		<style>
			body {
				margin: 0;
			}

			.editer {
				display: flex;
			}

			.directory {
				width: 300px;
				height: 100vh;
				overflow: auto;
				background-color: #252424;
				color: #ffffff;
			}

			.directory .open-btn {
				width: 100%;
				height: 36px;
			}

			.directory .files div {
				margin: 10px 25px;
			}

			.directory .files details {
				margin: 10px 5px;
			}

			.content {
				margin: 0;
				width: -webkit-fill-available;
				height: 100vh;
				overflow: auto;
				background-color: #313131;
			}

			.content .code {
				margin: 0;
				/* width: 100%; */
				/* height: 100%; */
				padding: 0;
				overflow: auto;
				border: none;
				background-color: #313131;
				color: #ffffff;
			}
		</style>
	</head>
	<body>
		<div class="editer">
			<div class="directory">
				<button class="open-btn" onclick="selectedFile()">打开</button>
				<div class="files"></div>
			</div>
			<pre class="content">
				<code class="code language-javaScript"></code>
			</pre>
		</div>



		<script>
			async function selectedFile() {
				try {
					const directories = await showDirectoryPicker()
					// console.log(directories);
					const files = await handleDirectory(directories)
					// console.log(files);

					const filesDOM = document.querySelector(".files");
					renderDirectoryTag(files, filesDOM)
				} catch (e) {
					console.log("您拒绝了访问目录, 授权打开目录才能导入文件");
				}
			};

			// 处理目录资源
			async function handleDirectory(data) {
				// 直接返回句柄
				if (data.kind === "file") {
					return data;
				}
				// 递归处理
				data.children = [];
				for await (const iterator of data.entries()) {
					// console.log(iterator);
					data.children.push(await handleDirectory(iterator[1]))
				}
				return data;
			};

			// 渲染 html
			function renderDirectoryTag(files, filesDOM) {
				// console.log(files, filesDOM);
				for (const index in files.children) {
					const file = files.children[index];
					// console.log(index, file);
					let details;
					if (file.children?.length > 0) {
						details = document.createElement("details")
						details.innerHTML = `<summary>${file.name}</summary>`;
						filesDOM.appendChild(details)
						renderDirectoryTag(file, details)
					} else {
						details = document.createElement("div")
						details.innerHTML = `<span>${file.name}</span>`;
						details.addEventListener('click', ()=>{
							readerFile(file)
						}, true)
					}
					filesDOM.appendChild(details)
				}
			}
			// 读取文件
			async function readerFile(file) {
				// console.log(file);
				const files = await file.getFile()
				// console.log(files);
				const reader = new FileReader();
				reader.readAsText(files, 'utf-8')
				reader.onload = (e) => {
					// console.log(e);
					const codeDOM = document.querySelector(".code");
					codeDOM.innerHTML = e.target.result;
					hljs.highlightBlock();
				}
			}
		</script>

		<script src="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js"></script>
		<script>
			hljs.highlightAll();
		</script>
	</body>
</html>
相关推荐
同学小张26 分钟前
【端侧AI 与 C++】1. llama.cpp源码编译与本地运行
开发语言·c++·aigc·llama·agi·ai-native
踢球的打工仔1 小时前
PHP面向对象(7)
android·开发语言·php
J***Q2923 小时前
Vue数据可视化
前端·vue.js·信息可视化
汤姆yu4 小时前
基于python的外卖配送及数据分析系统
开发语言·python·外卖分析
Yue丶越4 小时前
【C语言】字符函数和字符串函数
c语言·开发语言·算法
翔云 OCR API4 小时前
人脸识别API开发者对接代码示例
开发语言·人工智能·python·计算机视觉·ocr
V***u4534 小时前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言
ttod_qzstudio5 小时前
深入理解 Vue 3 的 h 函数:构建动态 UI 的利器
前端·vue.js
这是程序猿5 小时前
基于java的ssm框架旅游在线平台
java·开发语言·spring boot·spring·旅游·旅游在线平台
芳草萋萋鹦鹉洲哦5 小时前
【elemen/js】阻塞UI线程导致的开关卡顿如何优化
开发语言·javascript·ui