Spaces:
Running
Running
Commit ·
2de9fdc
1
Parent(s): 4415019
Remove showcase numbering and hide MakeCode share-page student name
Browse files- projects/DEMO/展示用學生/04_Fire迷宮/link.txt +1 -1
- projects/DEMO/展示用學生/展示備忘.md +2 -0
- server.py +9 -0
- static/js/index.js +1 -1
- templates/player.html +2 -2
projects/DEMO/展示用學生/04_Fire迷宮/link.txt
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
https://makecode.com/
|
|
|
|
| 1 |
+
https://arcade.makecode.com/--run?id=17380-99768-60760-10580
|
projects/DEMO/展示用學生/展示備忘.md
CHANGED
|
@@ -4,6 +4,8 @@
|
|
| 4 |
|
| 5 |
## 展示順序
|
| 6 |
|
|
|
|
|
|
|
| 7 |
1. `01_手勢按鈕挑戰`:MediaPipe 手部追蹤與三指捏合遊戲。
|
| 8 |
2. `02_臉部3D網格`:MediaPipe 臉部網格/特徵點視覺化。
|
| 9 |
3. `03_手指空中畫畫`:以手指追蹤繪圖。
|
|
|
|
| 4 |
|
| 5 |
## 展示順序
|
| 6 |
|
| 7 |
+
展示清單與播放器隱藏資料夾前面的排序編號,原資料夾及分享連結保留。Fire 迷宮使用 MakeCode 的模擬器頁面,只展示遊戲,不顯示原分享頁的學生姓名標題。
|
| 8 |
+
|
| 9 |
1. `01_手勢按鈕挑戰`:MediaPipe 手部追蹤與三指捏合遊戲。
|
| 10 |
2. `02_臉部3D網格`:MediaPipe 臉部網格/特徵點視覺化。
|
| 11 |
3. `03_手指空中畫畫`:以手指追蹤繪圖。
|
server.py
CHANGED
|
@@ -280,6 +280,8 @@ def _scan_projects_uncached() -> dict:
|
|
| 280 |
pass
|
| 281 |
|
| 282 |
if projects:
|
|
|
|
|
|
|
| 283 |
tree[class_name][student_name] = projects
|
| 284 |
|
| 285 |
if not tree[class_name]:
|
|
@@ -308,6 +310,12 @@ def scan_projects(force: bool = False) -> dict:
|
|
| 308 |
return tree
|
| 309 |
|
| 310 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 311 |
def get_id(name: str) -> str:
|
| 312 |
"""Stable 10-char hex hash for URL tokens."""
|
| 313 |
return hashlib.sha256(name.encode("utf-8")).hexdigest()[:10]
|
|
@@ -739,6 +747,7 @@ async def run_project_page(request: Request, student_token: str, project_name: s
|
|
| 739 |
"student_name": real_student,
|
| 740 |
"student_token": student_token,
|
| 741 |
"project_name": project_name,
|
|
|
|
| 742 |
"project_type": proj_type,
|
| 743 |
"external_url": external_url,
|
| 744 |
"apk_name": apk_name,
|
|
|
|
| 280 |
pass
|
| 281 |
|
| 282 |
if projects:
|
| 283 |
+
for project in projects:
|
| 284 |
+
project["display_name"] = _project_display_name(class_name, student_name, project["name"])
|
| 285 |
tree[class_name][student_name] = projects
|
| 286 |
|
| 287 |
if not tree[class_name]:
|
|
|
|
| 310 |
return tree
|
| 311 |
|
| 312 |
|
| 313 |
+
def _project_display_name(class_name: str, student_name: str, project_name: str) -> str:
|
| 314 |
+
if class_name == "DEMO" and student_name == "展示用學生":
|
| 315 |
+
return re.sub(r"^\d+_", "", project_name)
|
| 316 |
+
return project_name
|
| 317 |
+
|
| 318 |
+
|
| 319 |
def get_id(name: str) -> str:
|
| 320 |
"""Stable 10-char hex hash for URL tokens."""
|
| 321 |
return hashlib.sha256(name.encode("utf-8")).hexdigest()[:10]
|
|
|
|
| 747 |
"student_name": real_student,
|
| 748 |
"student_token": student_token,
|
| 749 |
"project_name": project_name,
|
| 750 |
+
"project_display_name": _project_display_name(real_class, real_student, project_name),
|
| 751 |
"project_type": proj_type,
|
| 752 |
"external_url": external_url,
|
| 753 |
"apk_name": apk_name,
|
static/js/index.js
CHANGED
|
@@ -292,7 +292,7 @@
|
|
| 292 |
meta.className = 'project-meta';
|
| 293 |
const title = document.createElement('span');
|
| 294 |
title.className = 'project-title';
|
| 295 |
-
title.textContent = proj.name;
|
| 296 |
const tag = document.createElement('span');
|
| 297 |
tag.className = `project-tag ${tagClass}`;
|
| 298 |
tag.textContent = tagText;
|
|
|
|
| 292 |
meta.className = 'project-meta';
|
| 293 |
const title = document.createElement('span');
|
| 294 |
title.className = 'project-title';
|
| 295 |
+
title.textContent = proj.display_name || proj.name;
|
| 296 |
const tag = document.createElement('span');
|
| 297 |
tag.className = `project-tag ${tagClass}`;
|
| 298 |
tag.textContent = tagText;
|
templates/player.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
<head>
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
-
<title>Telearn Arcade Player - {{
|
| 7 |
<!-- Google Fonts -->
|
| 8 |
<link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;600&family=Outfit:wght@400;600;800&family=Noto+Sans+TC:wght@400;700&display=swap" rel="stylesheet">
|
| 9 |
<link rel="stylesheet" href="/static/css/player.css">
|
|
@@ -23,7 +23,7 @@
|
|
| 23 |
</button>
|
| 24 |
<div class="project-title-wrapper" style="margin-left: 1.2rem; border-left: 1px solid rgba(255, 255, 255, 0.08); padding-left: 1.2rem;">
|
| 25 |
<span class="project-path">{{ class_name }} / {{ student_name }}</span>
|
| 26 |
-
<span class="project-name">{{
|
| 27 |
</div>
|
| 28 |
</div>
|
| 29 |
|
|
|
|
| 3 |
<head>
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Telearn Arcade Player - {{ project_display_name }}</title>
|
| 7 |
<!-- Google Fonts -->
|
| 8 |
<link href="https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;600&family=Outfit:wght@400;600;800&family=Noto+Sans+TC:wght@400;700&display=swap" rel="stylesheet">
|
| 9 |
<link rel="stylesheet" href="/static/css/player.css">
|
|
|
|
| 23 |
</button>
|
| 24 |
<div class="project-title-wrapper" style="margin-left: 1.2rem; border-left: 1px solid rgba(255, 255, 255, 0.08); padding-left: 1.2rem;">
|
| 25 |
<span class="project-path">{{ class_name }} / {{ student_name }}</span>
|
| 26 |
+
<span class="project-name">{{ project_display_name }}</span>
|
| 27 |
</div>
|
| 28 |
</div>
|
| 29 |
|