Skip to content

Commit 31ea74b

Browse files
committed
增加ttf预览功能
1 parent 57ebc14 commit 31ea74b

File tree

3 files changed

+78
-6
lines changed

3 files changed

+78
-6
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
dev:
2-
uvicorn servefs.main:app --reload --port 8003
2+
npx nodemon -e "js html py" --exec "uvicorn servefs.main:app --port 7001"

servefs/routes/api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ async def get_file_content(file_path: str, request: Request):
5959
if mime_type is None:
6060
mime_type = "application/octet-stream"
6161

62-
# Only read text files
63-
if not mime_type.startswith('text/'):
62+
# Read text files and JSON files
63+
if not (mime_type.startswith('text/') or mime_type == 'application/json'):
6464
return {"error": "Unsupported file type"}
6565

6666
try:

servefs/static/index.html

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,17 @@
140140
.file-info-actions {
141141
margin-top: 20px;
142142
}
143+
.font-preview {
144+
padding: 20px;
145+
max-height: 70vh;
146+
overflow-y: auto;
147+
}
148+
.preview-text {
149+
margin-bottom: 20px;
150+
}
151+
.preview-sizes div {
152+
margin: 10px 0;
153+
}
143154
</style>
144155
</head>
145156
<body>
@@ -271,6 +282,22 @@ <h1>ServeFS File Browser</h1>
271282
:rows="20"
272283
:readonly="!previewDialog.editable">
273284
</el-input>
285+
<!-- 字体预览 -->
286+
<div v-else-if="previewDialog.isFont" class="font-preview">
287+
<div class="preview-text">
288+
<el-input v-model="previewText" placeholder="输入预览文字">
289+
</el-input>
290+
</div>
291+
<div class="preview-sizes">
292+
<div v-for="size in [12, 16, 24, 32, 48]" :key="size">
293+
<div>{{ size }}px</div>
294+
<div :style="{
295+
fontSize: size + 'px',
296+
fontFamily: previewDialog.fontFamily
297+
}">{{ previewText }}</div>
298+
</div>
299+
</div>
300+
</div>
274301
<!-- 文件信息卡片 -->
275302
<div v-else class="file-info-card">
276303
<div class="file-info-icon">
@@ -340,6 +367,9 @@ <h1>ServeFS File Browser</h1>
340367
currentFile: null,
341368
isImage: false,
342369
isText: false,
370+
isFont: false,
371+
fontUrl: '',
372+
fontFamily: '',
343373
fileSize: 0,
344374
mimeType: ''
345375
});
@@ -348,6 +378,7 @@ <h1>ServeFS File Browser</h1>
348378
title: '',
349379
message: ''
350380
});
381+
const previewText = ref('Hello 你好 こんにちは 123');
351382

352383
// Get initial path from URL
353384
const initPath = () => {
@@ -421,11 +452,30 @@ <h1>ServeFS File Browser</h1>
421452
currentFile: item,
422453
isImage: true,
423454
isText: false,
455+
isFont: false,
456+
fontUrl: '',
457+
fontFamily: '',
424458
fileSize: 0,
425459
mimeType: ''
426460
};
427-
} else if (item.mime_type.startsWith('text/')) {
428-
// 对于文本文件,获取内容并显示在编辑器中
461+
} else if (item.name.toLowerCase().endsWith('.ttf')) {
462+
// TTF 字体文件预览
463+
previewDialog.value = {
464+
visible: true,
465+
title: item.name,
466+
content: '',
467+
editable: false,
468+
currentFile: item,
469+
isImage: false,
470+
isText: false,
471+
isFont: true,
472+
fontUrl: `/raw/${item.path}`,
473+
fontFamily: '',
474+
fileSize: item.size,
475+
mimeType: 'font/ttf'
476+
};
477+
} else if (item.mime_type.startsWith('text/') || item.mime_type === 'application/json') {
478+
// 对于文本文件和 JSON 文件,获取内容并显示在编辑器中
429479
const response = await fetch(`/api/files/${item.path}`);
430480
const data = await response.json();
431481
if (data.error) {
@@ -440,6 +490,9 @@ <h1>ServeFS File Browser</h1>
440490
currentFile: item,
441491
isImage: false,
442492
isText: true,
493+
isFont: false,
494+
fontUrl: '',
495+
fontFamily: '',
443496
fileSize: item.size,
444497
mimeType: item.mime_type
445498
};
@@ -452,6 +505,9 @@ <h1>ServeFS File Browser</h1>
452505
currentFile: item,
453506
isImage: false,
454507
isText: false,
508+
isFont: false,
509+
fontUrl: '',
510+
fontFamily: '',
455511
fileSize: item.size,
456512
mimeType: item.mime_type
457513
};
@@ -653,6 +709,21 @@ <h1>ServeFS File Browser</h1>
653709
window.removeEventListener('keydown', handleKeydown);
654710
});
655711

712+
watch(() => previewDialog.value.fontUrl, (newUrl) => {
713+
if (newUrl && previewDialog.value.isFont) {
714+
const fontFamily = 'PreviewFont_' + Date.now();
715+
const style = document.createElement('style');
716+
style.textContent = `
717+
@font-face {
718+
font-family: '${fontFamily}';
719+
src: url('${newUrl}') format('truetype');
720+
}
721+
`;
722+
document.head.appendChild(style);
723+
previewDialog.value.fontFamily = fontFamily;
724+
}
725+
});
726+
656727
return {
657728
fileList,
658729
currentPath,
@@ -674,7 +745,8 @@ <h1>ServeFS File Browser</h1>
674745
formatFileSize,
675746
handleFileSelect,
676747
handleFileDrop,
677-
downloadFile
748+
downloadFile,
749+
previewText
678750
};
679751
}
680752
});

0 commit comments

Comments
 (0)