2024年9月8日

以JS處理moodle選擇題轉檔

 這兩天葉老師問我有關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>