這兩天葉老師問我有關Moodle的GIFT題目格式的問題,如果要使用多選題,應該如何使用符號,後來我找了moodle官方的頁面答案給她
What two people are entombed in Grant's tomb? {
   ~%-50%No one
   ~%50%Grant
   ~%50%Grant's wife
   ~%-50%Grant's father
}
已經有題庫的人,可以用一些批次方法直接處理這些題目轉檔的問題,例如python,但如果是對程式陌生的人,讓他使用python的話,可能太難。
不過現在這個時代,有很多方法可以處理,例如你可以用自然語言讓AI寫出一個轉檔程式啊,像是用Claude,它的Artifacts功能甚至還可以直接在頁面旁產出程式執行的畫面。
回到本文主題,如何讓沒有程式基礎的人可以順利轉檔,那就寫一個轉檔程式來使用吧。
把以下的文字貼在記事本上,副檔名存成html,例如convert.html,用瀏覽器打開就是一個轉檔程式了。
使用方式就是打開excel,把題目複製貼到轉檔程式上方的框框,按下按鈕就生成轉檔完的文字了。
這個程式只有處理單選和多選題目而已,程式是根據標準答案來分辨單選或多選,標準答案使用123來編碼,而不是ABC
===================
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>轉換工具</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        textarea {
            width: 80%;
            height: 300px;
            margin-bottom: 10px;
        }
        .button-container {
            text-align: left; /* 将按钮靠左对齐 */
            margin-bottom: 10px;
        }		
        button {
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <h1>題目轉換工具</h1>
    <textarea id="input" placeholder="貼上excel複製的文字"></textarea>
    <div class="button-container">
        <button onclick="convert()">轉換</button>
    </div>
    <textarea id="output" placeholder="輸出結果" readonly></textarea>
    <script>
		function convert() {
			const inputText = document.getElementById('input').value.trim();
			const outputElement = document.getElementById('output');
			
			if (!inputText) {
				outputElement.value = '請輸入數據。';
				return;
			}
			const lines = inputText.split('\n').map(line => line.trim()).filter(line => line);
			let result = '';
			for (const line of lines) {
                const [title, question, ...optionsAndAnswer] = line.split('\t');
				const answerIndex = optionsAndAnswer.pop(); // 正確答案
				const options = optionsAndAnswer;
				const correctIndices = answerIndex.split('').map(Number);
				const numOptions = options.length;
				const numCorrect = correctIndices.length;
                result += `::${title}::${question} {\n`;
				if (numCorrect === 1) {
					// 單選題
					options.forEach((option, index) => {
						if (correctIndices.includes(index + 1)) {
							result += `   =${option}\n`;
						} else {
							result += `   ~${option}\n`;
						}
					});
				} else {
					// 多選題
					const percentage = numCorrect > 0 ? Math.floor(100 / numCorrect) : 0; // 計算正確答案的百分比
					options.forEach((option, index) => {
						if (correctIndices.includes(index + 1)) {
							result += `   ~%${percentage}%${option}\n`;
						} else {
							result += `   ~%-100%${option}\n`;
						}
					});
				}
				result += '}\n\n';
			}
			outputElement.value = result.trim();
		}
    </script>
</body>
</html>