File size: 3,721 Bytes
a79f199
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import streamlit as st
import text2qti
import traceback
import subprocess
import os

def convert_txt_to_qti(file_path):
    # Use subprocess to run the text2qti command
    output_file = file_path.replace('.txt', '.zip')
    try:
        subprocess.run(["text2qti", file_path], check=True, capture_output=True, text=True)
        return output_file, None
    except subprocess.CalledProcessError as e:
        # Capture the stderr output
        error_message = e.stderr.strip() if e.stderr else "An error occurred without any specific error message."
        return None, error_message

def main():
    st.title("text2qti Converter")

    st.markdown("""
        For help or more information about how to generate/format .txt files for conversion and upload to Canvas, please visit the [following walk-through guide.](https://reutherlab.biosci.ucsd.edu/)
    """)
    
    uploaded_file = st.file_uploader("Upload a .txt file", type=["txt"])

    if uploaded_file:
        # Extract the filename without the extension
        file_name = os.path.splitext(uploaded_file.name)[0]

        # Save the uploaded file to a location with the same name
        temp_file_path = f"{file_name}.txt"
        with open(temp_file_path, "wb") as f:
            f.write(uploaded_file.getbuffer())

        st.write("File uploaded successfully!")

        # Button to initiate the conversion
        if st.button('Convert to QTI'):
            try:  
                qti_zip_file, error = convert_txt_to_qti(temp_file_path)
                if qti_zip_file and os.path.exists(qti_zip_file):
                    with open(qti_zip_file, "rb") as f:
                        zip_data = f.read()
                    st.download_button(f'Download {file_name}.zip', zip_data, file_name=f'{file_name}.zip', mime='application/zip')
                else:
                    # If the conversion failed, display the error message
                    error_message = (f"""Failed to convert the file. You will see a long, confusing error. **Focus on the part that provides a line number and text from the quiz itself. it will often be near the end of the error message.**  
                                     ---  
                                     **Here is an made-up example of what you should look for:**  
                                     In test_quiz_error.txt on line 23: Syntax error; unexpected text, or incorrect indentation for a wrapped paragraph: #a) Polar heads face outward, nonpolar tails face inward  
                                     This would indicate that there is an error on line 23 of the quiz. You need to change #a) to \*a) to fix the error.     
                                     Please visit the walkthrough linked above for more information.  
                                     ---  
                    **Your error:**  
                                     {error}") 
                    """)
                    st.markdown(error_message)
            except Exception as e:
                # Catch any other exception that might occur and display it using traceback
                error_traceback = traceback.format_exc()
                st.error(f"An unexpected error occurred: {error_traceback}") 


    # Footer
    st.markdown("---")
    st.markdown("""
        The text2qti python library is Copyright (c) 2020 by Geoffrey M. Poore. 
        It can be found at [https://github.com/gpoore/text2qti](https://github.com/gpoore/text2qti) 
        and is distributed under the BSD 3-Clause License.
    """)
    st.markdown("""
        This app is managed by Keefe Reuther - [https://reutherlab.biosci.ucsd.edu/](https://reutherlab.biosci.ucsd.edu/)
    """)

if __name__ == "__main__":
    main()