mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-06 03:20:13 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b41e67ee0b | ||
|
|
50a0bbbab1 | ||
|
|
d712925d0f | ||
|
|
b78398680d | ||
|
|
c7f52b1003 | ||
|
|
f008fb9f60 | ||
|
|
76a39add29 |
No files matched your search
@@ -90,7 +90,7 @@ const handleChange = () => {
|
||||
class="bg-bg border-8 border-bg-primary flex flex-1 flex-col items-center justify-center rounded-3xl p-10"
|
||||
>
|
||||
<h1 class="text-text-primary text-3xl font-black mb-2">{{ title }}</h1>
|
||||
<div class="text-error inline-flex justify-center items-center xl:hidden">
|
||||
<div class="text-error inline-flex justify-center items-center md:hidden">
|
||||
<font-awesome-icon
|
||||
:icon="['fas', 'circle-exclamation']"
|
||||
class="px-1 text-sm"
|
||||
|
||||
@@ -15,8 +15,8 @@ import { DAG } from '@linux-odyssey/utils'
|
||||
import api from '../utils/api'
|
||||
import { NodeImage } from '../img/svg.js'
|
||||
|
||||
const marginX = 200
|
||||
const marginY = 65
|
||||
const marginX = 500
|
||||
const marginY = 300
|
||||
const chartContainer = ref(null)
|
||||
let chartInstance = null
|
||||
const fullwidth = window.screen.width
|
||||
@@ -71,9 +71,10 @@ const genOption = (nodes, edges) => ({
|
||||
symbol: () => {
|
||||
return NodeImage
|
||||
},
|
||||
symbolSize: [fullwidth / 10, fullwidth / 25],
|
||||
symbolSize: [fullwidth / 13, fullwidth / 30],
|
||||
roam: 'move',
|
||||
zoom: 1,
|
||||
zoom: 1.5,
|
||||
center: ['150%', '50%'],
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: fullwidth / 90,
|
||||
@@ -103,7 +104,7 @@ const genOption = (nodes, edges) => ({
|
||||
if (unlocked) {
|
||||
return '#ADADB5'
|
||||
}
|
||||
return '454552'
|
||||
return '#505050'
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -17,6 +17,14 @@ stages:
|
||||
hints:
|
||||
- '!! 請勿使用全形空格 !!'
|
||||
|
||||
- id: warning-02
|
||||
repeatable: true
|
||||
condition:
|
||||
command:
|
||||
- '`'
|
||||
hints:
|
||||
- '!! 不需要輸入上下引號 !!'
|
||||
|
||||
- id: start
|
||||
task: 輸入 `echo start` 來開始教程
|
||||
condition:
|
||||
|
||||
@@ -64,14 +64,12 @@ stages:
|
||||
- ➤ 請輸入 `cd ../folder2` 來進入 `folder2` 資料夾。
|
||||
|
||||
- id: cd-folder2
|
||||
task: 用指定方式進入 `folder2` 資料夾
|
||||
task: 進入 `folder2` 資料夾
|
||||
requirements:
|
||||
- cd-folder1
|
||||
condition:
|
||||
pwd:
|
||||
- ^/home/commander/folder2$
|
||||
command:
|
||||
- ^cd \.\./folder2$
|
||||
exceptions:
|
||||
- condition:
|
||||
not:
|
||||
@@ -95,10 +93,8 @@ stages:
|
||||
requirements:
|
||||
- cd-folder2
|
||||
condition:
|
||||
pwd:
|
||||
- ^/home/commander/folder2$
|
||||
command:
|
||||
- ^ls \.\.\/folder1$
|
||||
output:
|
||||
- file1.txt
|
||||
exceptions:
|
||||
- condition:
|
||||
not:
|
||||
@@ -107,7 +103,7 @@ stages:
|
||||
responses:
|
||||
- type: narrative
|
||||
content:
|
||||
- 請先回到 `folder2` 資料夾,並用指定的方式查看 `folder1` 資料夾的內容。
|
||||
- 進到 `folder1` 資料夾並用 `ls` 查看內容。
|
||||
responses:
|
||||
- content:
|
||||
- 很好,你現在知道如何運用相對路徑了。
|
||||
|
||||
@@ -68,7 +68,7 @@ stages:
|
||||
- id: ls-folder
|
||||
task: 查看 `folder` 資料夾
|
||||
requirements:
|
||||
- cat-file
|
||||
- cat-file1
|
||||
condition:
|
||||
pwd:
|
||||
- ^/home/commander$
|
||||
|
||||
@@ -50,9 +50,18 @@ export default class CommandHandler extends SessionHandler {
|
||||
}
|
||||
|
||||
async discoverHandler() {
|
||||
const graph = new FileGraph(this.session.graph)
|
||||
graph.discover(this.params.discover)
|
||||
this.session.graph = graph
|
||||
try {
|
||||
const graph = new FileGraph(this.session.graph)
|
||||
graph.discover(this.params.discover)
|
||||
this.session.graph = graph
|
||||
} catch (e) {
|
||||
logger.error('Update file graph failed', {
|
||||
error: e,
|
||||
session: this.session.id,
|
||||
graph: this.session.graph,
|
||||
discover: this.params.discover,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
async isMatch(condition) {
|
||||
@@ -111,37 +120,46 @@ export default class CommandHandler extends SessionHandler {
|
||||
}
|
||||
|
||||
async run() {
|
||||
this.quest = await Quest.findById(this.session.quest)
|
||||
const stages = this.getStages()
|
||||
if (stages.length === 0) {
|
||||
logger.warn('stage not found', this.session.tasks)
|
||||
return {}
|
||||
}
|
||||
|
||||
this.handleEvent()
|
||||
this.handleCommand()
|
||||
|
||||
const matches = await Promise.all(
|
||||
stages.map((stage) => this.isMatch(stage.condition))
|
||||
)
|
||||
|
||||
const stage = stages.find((_, i) => matches[i])
|
||||
if (!stage) {
|
||||
for (const s of stages) {
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
const exception = await this.checkException(s)
|
||||
if (exception) {
|
||||
return this.executeException(exception)
|
||||
}
|
||||
try {
|
||||
this.quest = await Quest.findById(this.session.quest)
|
||||
const stages = this.getStages()
|
||||
if (stages.length === 0) {
|
||||
logger.warn('stage not found', this.session.tasks)
|
||||
return {}
|
||||
}
|
||||
return {}
|
||||
}
|
||||
const response = this.execute(stage)
|
||||
|
||||
return {
|
||||
stage: stage.id,
|
||||
end: this.session.status === 'finished',
|
||||
...response,
|
||||
this.handleEvent()
|
||||
this.handleCommand()
|
||||
|
||||
const matches = await Promise.all(
|
||||
stages.map((stage) => this.isMatch(stage.condition))
|
||||
)
|
||||
|
||||
const stage = stages.find((_, i) => matches[i])
|
||||
if (!stage) {
|
||||
for (const s of stages) {
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
const exception = await this.checkException(s)
|
||||
if (exception) {
|
||||
return this.executeException(exception)
|
||||
}
|
||||
}
|
||||
return {}
|
||||
}
|
||||
const response = this.execute(stage)
|
||||
|
||||
return {
|
||||
stage: stage.id,
|
||||
end: this.session.status === 'finished',
|
||||
...response,
|
||||
}
|
||||
} catch (err) {
|
||||
logger.error('CommandHandler error', {
|
||||
error: err,
|
||||
session: this.session.id,
|
||||
command: this.commandInput,
|
||||
})
|
||||
return {}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user