excel2moodle 0.4.0__py3-none-any.whl → 0.4.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. excel2moodle/__main__.py +8 -9
  2. excel2moodle/core/__init__.py +0 -10
  3. excel2moodle/core/category.py +4 -3
  4. excel2moodle/core/dataStructure.py +85 -57
  5. excel2moodle/core/etHelpers.py +2 -2
  6. excel2moodle/core/exceptions.py +2 -2
  7. excel2moodle/core/globals.py +10 -27
  8. excel2moodle/core/parser.py +24 -30
  9. excel2moodle/core/question.py +147 -63
  10. excel2moodle/core/settings.py +73 -45
  11. excel2moodle/core/validator.py +36 -55
  12. excel2moodle/logger.py +3 -3
  13. excel2moodle/question_types/__init__.py +2 -0
  14. excel2moodle/question_types/cloze.py +207 -0
  15. excel2moodle/question_types/mc.py +26 -16
  16. excel2moodle/question_types/nf.py +17 -3
  17. excel2moodle/question_types/nfm.py +60 -17
  18. excel2moodle/ui/{windowEquationChecker.py → UI_equationChecker.py} +98 -78
  19. excel2moodle/ui/{exportSettingsDialog.py → UI_exportSettingsDialog.py} +55 -4
  20. excel2moodle/ui/{windowMain.py → UI_mainWindow.py} +32 -39
  21. excel2moodle/ui/appUi.py +35 -66
  22. excel2moodle/ui/dialogs.py +40 -2
  23. excel2moodle/ui/equationChecker.py +70 -0
  24. excel2moodle/ui/treewidget.py +4 -4
  25. {excel2moodle-0.4.0.dist-info → excel2moodle-0.4.2.dist-info}/METADATA +2 -3
  26. excel2moodle-0.4.2.dist-info/RECORD +38 -0
  27. {excel2moodle-0.4.0.dist-info → excel2moodle-0.4.2.dist-info}/entry_points.txt +0 -3
  28. excel2moodle/ui/questionPreviewDialog.py +0 -115
  29. excel2moodle-0.4.0.dist-info/RECORD +0 -37
  30. /excel2moodle/ui/{variantDialog.py → UI_variantDialog.py} +0 -0
  31. {excel2moodle-0.4.0.dist-info → excel2moodle-0.4.2.dist-info}/WHEEL +0 -0
  32. {excel2moodle-0.4.0.dist-info → excel2moodle-0.4.2.dist-info}/licenses/LICENSE +0 -0
  33. {excel2moodle-0.4.0.dist-info → excel2moodle-0.4.2.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,9 @@
1
1
  """This Module hosts the various Dialog Classes, that can be shown from main Window."""
2
2
 
3
+ import logging
4
+ from pathlib import Path
5
+ from typing import TYPE_CHECKING
6
+
3
7
  import lxml.etree as ET
4
8
  from PySide6 import QtGui, QtWidgets
5
9
  from PySide6.QtSvgWidgets import QGraphicsSvgItem
@@ -7,8 +11,13 @@ from PySide6.QtSvgWidgets import QGraphicsSvgItem
7
11
  from excel2moodle import e2mMetadata
8
12
  from excel2moodle.core.globals import XMLTags
9
13
  from excel2moodle.core.question import Question
10
- from excel2moodle.ui.exportSettingsDialog import Ui_ExportDialog
11
- from excel2moodle.ui.variantDialog import Ui_Dialog
14
+ from excel2moodle.ui.UI_exportSettingsDialog import Ui_ExportDialog
15
+ from excel2moodle.ui.UI_variantDialog import Ui_Dialog
16
+
17
+ if TYPE_CHECKING:
18
+ from excel2moodle.ui.appUi import MainWindow
19
+
20
+ logger = logging.getLogger(__name__)
12
21
 
13
22
 
14
23
  class QuestionVariantDialog(QtWidgets.QDialog):
@@ -36,8 +45,37 @@ class ExportDialog(QtWidgets.QDialog):
36
45
  def __init__(self, parent) -> None:
37
46
  super().__init__(parent)
38
47
  self.setWindowTitle("Export question Selection")
48
+ self.appUi: MainWindow = parent
39
49
  self.ui = Ui_ExportDialog()
40
50
  self.ui.setupUi(self)
51
+ self.ui.btnExportFile.clicked.connect(self.getExportFile)
52
+
53
+ @property
54
+ def exportFile(self) -> Path:
55
+ return self._exportFile
56
+
57
+ @exportFile.setter
58
+ def exportFile(self, value: Path) -> None:
59
+ self._exportFile = value
60
+ self.ui.btnExportFile.setText(
61
+ f"../{(self.exportFile.parent.name)}/{self.exportFile.name}"
62
+ )
63
+
64
+ def getExportFile(self) -> None:
65
+ path = QtWidgets.QFileDialog.getSaveFileName(
66
+ self,
67
+ "Select Output File",
68
+ dir=str(self.exportFile),
69
+ filter="xml Files (*.xml)",
70
+ )
71
+ path = Path(path[0])
72
+ if path.is_file():
73
+ self.exportFile = path
74
+ self.ui.btnExportFile.setText(
75
+ f"../{(self.exportFile.parent.name)}/{self.exportFile.name}"
76
+ )
77
+ else:
78
+ logger.warning("No Export File selected")
41
79
 
42
80
 
43
81
  class QuestionPreview:
@@ -0,0 +1,70 @@
1
+ import logging
2
+ import math
3
+ from pathlib import Path
4
+
5
+ from PySide6 import QtWidgets
6
+
7
+ from excel2moodle import mainLogger
8
+ from excel2moodle.core.question import ParametricQuestion
9
+ from excel2moodle.core.settings import Tags
10
+ from excel2moodle.logger import LogWindowHandler
11
+ from excel2moodle.question_types.nfm import NFMQuestionParser
12
+
13
+ from .UI_equationChecker import Ui_EquationChecker
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+ loggerSignal = LogWindowHandler()
18
+ mainLogger.addHandler(loggerSignal)
19
+
20
+
21
+ class EqCheckerWindow(QtWidgets.QWidget):
22
+ def __init__(self) -> None:
23
+ super().__init__()
24
+ self.excelFile = Path()
25
+ self.ui = Ui_EquationChecker()
26
+ self.ui.setupUi(self)
27
+ self.ui.buttonRunCheck.clicked.connect(
28
+ lambda: self.updateCalculation(),
29
+ )
30
+ self.question: ParametricQuestion
31
+
32
+ def updateCalculation(self) -> None:
33
+ equation = self.ui.equationText.toPlainText()
34
+ results: list[float] = []
35
+ firstResult = self.question.rawData.get(Tags.FIRSTRESULT)
36
+ for i in range(self.question.variants):
37
+ NFMQuestionParser.setupAstIntprt(self.question.variables, i)
38
+ results.append(float(NFMQuestionParser.astEval(equation)))
39
+ check: bool = False
40
+ self.ui.textResultsOutput.insertHtml(f"<hr><br><h2>{equation:^30}</h2><br>")
41
+ for i, calculation in enumerate(results):
42
+ if i == 0 and firstResult != 0:
43
+ check = bool(math.isclose(calculation, firstResult, rel_tol=0.01))
44
+ self.ui.lineCalculatedRes.setText(f"{calculation}")
45
+ self.ui.textResultsOutput.append(f"<h3>Result {check = }</h3><br>")
46
+ self.ui.textResultsOutput.append(
47
+ f"Ergebnis {i + 1}: \t{calculation}",
48
+ )
49
+ if check:
50
+ self.ui.lineCheckResult.setText("[OK]")
51
+ logger.info(
52
+ " [OK] The first calculated result matches 'firstResult'",
53
+ )
54
+ else:
55
+ self.ui.lineCheckResult.setText("[ERROR]")
56
+ logger.warning(
57
+ "The first calculated result does not match 'firstResult'",
58
+ )
59
+
60
+ def setup(self, question: ParametricQuestion) -> None:
61
+ self.question = question
62
+ self.ui.textResultsOutput.clear()
63
+ self.ui.equationText.clear()
64
+ bullets = question.rawData.get(Tags.BPOINTS)
65
+ firstResult = question.rawData.get(Tags.FIRSTRESULT)
66
+ self.ui.lineFirstResult.setText(str(firstResult))
67
+ self.ui.equationText.appendPlainText(question.rawData.get(Tags.EQUATION))
68
+ for bullet in bullets:
69
+ self.ui.textResultsOutput.append(bullet)
70
+ self.updateCalculation()
@@ -2,11 +2,11 @@ from PySide6 import QtWidgets
2
2
  from PySide6.QtCore import Qt
3
3
 
4
4
  from excel2moodle.core.dataStructure import Category
5
- from excel2moodle.core.question import Question
5
+ from excel2moodle.core.question import ParametricQuestion, Question
6
6
 
7
7
 
8
8
  class QuestionItem(QtWidgets.QTreeWidgetItem):
9
- def __init__(self, parent, question: Question) -> None:
9
+ def __init__(self, parent, question: Question | ParametricQuestion) -> None:
10
10
  super().__init__(parent)
11
11
  self.setData(2, Qt.UserRole, question)
12
12
  self.setText(0, question.id)
@@ -15,7 +15,7 @@ class QuestionItem(QtWidgets.QTreeWidgetItem):
15
15
  if hasattr(question, "variants") and question.variants is not None:
16
16
  self.setText(3, str(question.variants))
17
17
 
18
- def getQuestion(self) -> Question:
18
+ def getQuestion(self) -> Question | ParametricQuestion:
19
19
  """Return the question Object the QTreeWidgetItem represents."""
20
20
  return self.data(2, Qt.UserRole)
21
21
 
@@ -40,7 +40,7 @@ class CategoryItem(QtWidgets.QTreeWidgetItem):
40
40
  for child in self.iterateChildren():
41
41
  q = child.getQuestion()
42
42
  if hasattr(q, "variants") and q.variants is not None:
43
- count = q.variants if count <= q.variants else count
43
+ count = max(q.variants, count)
44
44
  return count
45
45
 
46
46
  def getCategory(self) -> Category:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: excel2moodle
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: A package for converting questions from a spreadsheet, to valid moodle-xml
5
5
  Author: Jakob Bosse
6
6
  License-Expression: GPL-3.0-or-later
@@ -14,10 +14,9 @@ Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: pyside6>=6.8.0
16
16
  Requires-Dist: pandas>=2.1.3
17
- Requires-Dist: openpyxl>=3.1.5
18
17
  Requires-Dist: lxml>=5.4.0
19
- Requires-Dist: odfpy>=1.4.1
20
18
  Requires-Dist: asteval>=1.0.6
19
+ Requires-Dist: python-calamine>=0.3.2
21
20
  Dynamic: license-file
22
21
 
23
22
  # excel 2 Moodle
@@ -0,0 +1,38 @@
1
+ excel2moodle/__init__.py,sha256=qdQJY0xbSiEhnmqbgJpqBe0kHec7yLOeAdcArScioE8,1925
2
+ excel2moodle/__main__.py,sha256=sG4ygwfVFskLQorBn-v98SvasNcPmwl_vLYpruT5Hk8,1175
3
+ excel2moodle/logger.py,sha256=hX5ZD_vBi7_eFyA98zomEMtHCEMjPcQRUOhtcavY0Po,3065
4
+ excel2moodle/core/__init__.py,sha256=87BwhtZse72Tk17Ib-V9X2k9wkhmtVnEj2ZmJ9JBAnI,63
5
+ excel2moodle/core/category.py,sha256=TzntDhEURshxWuI6qc_K_t5bSTLXn6s0n_RA56Basg8,1885
6
+ excel2moodle/core/dataStructure.py,sha256=MKT3udbfcP9QW_ZdiJyn3_GtfdpcgyOo9CGZ6pvSlRI,14374
7
+ excel2moodle/core/etHelpers.py,sha256=G37qplp8tPJxqHNCBrf2Wo0jJZ0aDbxE9slQavqYqd8,2293
8
+ excel2moodle/core/exceptions.py,sha256=9xfsaIcm6Yej6QAZga0d3DK3jLQejdfgJARuAaG-uZY,739
9
+ excel2moodle/core/globals.py,sha256=Zm1wcrzQTRnhjrkwgBvo7VjKCFdPMjh-VLSSI5_QCO8,2837
10
+ excel2moodle/core/numericMultiQ.py,sha256=vr-gYogu2sf2a_Bhvhnu1ZSZFZXM32MfhJesjTkoOQM,2618
11
+ excel2moodle/core/parser.py,sha256=Ec8bQ0CiiZCIdzQovfH2rce406wmyRmvhpDrCPeQfGU,8112
12
+ excel2moodle/core/question.py,sha256=u8hE5UpKO9AUvR3XRz9yohw1XhSyLEfTJENAN4w80-U,10747
13
+ excel2moodle/core/settings.py,sha256=b7g7zSI7ACcOG_NI34Nc7uZIX_miL2tO1O6MOd8kJTE,7536
14
+ excel2moodle/core/stringHelpers.py,sha256=OzFZ6Eu3PeBLKb61K-aeVfUZmVuBerr9KfyOsuNRd7Y,2403
15
+ excel2moodle/core/validator.py,sha256=RwDQ-9Fpc5i2Buy3oorWUAh5zsS5fCF-MjRT4CgcXhY,4698
16
+ excel2moodle/extra/__init__.py,sha256=PM-id60HD21A3IcGC_fCYFihS8osBGZMIJCcN-ZRsIM,293
17
+ excel2moodle/extra/equationVerification.py,sha256=GLJl1r90d8AAiNy0H2hooZrg3D6aEwNfifYKAe3aGxM,3921
18
+ excel2moodle/question_types/__init__.py,sha256=81mss0g7SVtnlb-WkydE28G_dEAAf6oT1uB8lpK2-II,1041
19
+ excel2moodle/question_types/cloze.py,sha256=wTCaCXCxR_qg909w1jGiBP7-c7qmq7kmriGpAbDnBEA,7673
20
+ excel2moodle/question_types/mc.py,sha256=rHKIKSNeHyto84bI9B3wMKzNJuluplsCmYM4k2HW3wQ,5213
21
+ excel2moodle/question_types/nf.py,sha256=bMP4IXrhnXmAI0NmjEc7DtX4xGaUbxzLicE2LjeaUho,1150
22
+ excel2moodle/question_types/nfm.py,sha256=41dY53vJcFZHoDvNq4Wo7oExHMd3jRF_8dqa2I_pyp0,4950
23
+ excel2moodle/ui/UI_equationChecker.py,sha256=evQDlqCHeooJcAnYjhFCyjlPhfknr7ULGKQwMmqQeJ4,8947
24
+ excel2moodle/ui/UI_exportSettingsDialog.py,sha256=71xxXEqtewN0ReMfJ5t4gbrX_Bf0VEuxJ_DIV7ZtH94,6045
25
+ excel2moodle/ui/UI_mainWindow.py,sha256=asWUmKIYqufKUvRuCuA1JoMyv4qfRXyoR70F0331lww,19291
26
+ excel2moodle/ui/UI_variantDialog.py,sha256=snVaF3_YAc7NWjMRg7NzbjL_PzNbOpt4eiqElkE46io,5414
27
+ excel2moodle/ui/__init__.py,sha256=4EdGtpzwH3rgw4xW9E5x9kdPQYwKbo9rehHRZTNxCrQ,44
28
+ excel2moodle/ui/appUi.py,sha256=xwooDG3A8Ro5mrg-pCvdSR6NCFZYT0dj6dKPRqQfrLo,10382
29
+ excel2moodle/ui/dialogs.py,sha256=JbQ1y55wbzWVTY0nxdGrUm81AdOIY3PXKgET03Hc6Ys,6760
30
+ excel2moodle/ui/equationChecker.py,sha256=ANpN7S0llkp6pGL1sKHII1Jc8YUvgDR458UnGVnZZOo,2702
31
+ excel2moodle/ui/treewidget.py,sha256=az64swVj1yQUsioeaZys32AauvQDdC4EKcqdbbWgL6s,2489
32
+ excel2moodle/ui/windowDoc.py,sha256=WvzHj6F4JvHP82WlTsyFeOXW024Xq3BUqtp--T4twuI,661
33
+ excel2moodle-0.4.2.dist-info/licenses/LICENSE,sha256=ywQqe6Sitymkf2lV2NRcx_aGsaC-KbSl_EfEsRXmNRw,35135
34
+ excel2moodle-0.4.2.dist-info/METADATA,sha256=k4bCqH4CxEiRrCUjAf8mCUPB8loLmTkVPfPohgmQqwQ,2951
35
+ excel2moodle-0.4.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
36
+ excel2moodle-0.4.2.dist-info/entry_points.txt,sha256=myfMLDThuGgWHMJDPPfILiZqo_7D3fhmDdJGqWOAjPw,60
37
+ excel2moodle-0.4.2.dist-info/top_level.txt,sha256=5V1xRUQ9o7UmOCmNoWCZPAuy5nXp3Qbzyqch8fUGT_c,13
38
+ excel2moodle-0.4.2.dist-info/RECORD,,
@@ -1,5 +1,2 @@
1
1
  [console_scripts]
2
2
  excel2moodle = excel2moodle.__main__:main
3
-
4
- [gui_scripts]
5
- excel2moodle = excel2moodle.__main__:main
@@ -1,115 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- ################################################################################
4
- ## Form generated from reading UI file 'questionPreviewDialog.ui'
5
- ##
6
- ## Created by: Qt User Interface Compiler version 6.8.1
7
- ##
8
- ## WARNING! All changes made in this file will be lost when recompiling UI file!
9
- ################################################################################
10
-
11
- from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
12
- QMetaObject, QObject, QPoint, QRect,
13
- QSize, QTime, QUrl, Qt)
14
- from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
15
- QFont, QFontDatabase, QGradient, QIcon,
16
- QImage, QKeySequence, QLinearGradient, QPainter,
17
- QPalette, QPixmap, QRadialGradient, QTransform)
18
- from PySide6.QtWidgets import (QAbstractButton, QApplication, QDialog, QDialogButtonBox,
19
- QFormLayout, QFrame, QGraphicsView, QLabel,
20
- QLineEdit, QSizePolicy, QVBoxLayout, QWidget)
21
-
22
- class Ui_QuestionPrevDialog(object):
23
- def setupUi(self, QuestionPrevDialog):
24
- if not QuestionPrevDialog.objectName():
25
- QuestionPrevDialog.setObjectName(u"QuestionPrevDialog")
26
- QuestionPrevDialog.resize(577, 620)
27
- self.verticalLayout = QVBoxLayout(QuestionPrevDialog)
28
- self.verticalLayout.setObjectName(u"verticalLayout")
29
- self.formLayout = QFormLayout()
30
- self.formLayout.setObjectName(u"formLayout")
31
- self.formLayout.setLabelAlignment(Qt.AlignmentFlag.AlignLeading|Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignVCenter)
32
- self.formLayout.setHorizontalSpacing(20)
33
- self.formLayout.setVerticalSpacing(5)
34
- self.formLayout.setContentsMargins(10, 6, 10, -1)
35
- self.questionNameLabel = QLabel(QuestionPrevDialog)
36
- self.questionNameLabel.setObjectName(u"questionNameLabel")
37
-
38
- self.formLayout.setWidget(0, QFormLayout.LabelRole, self.questionNameLabel)
39
-
40
- self.qNameLine = QLineEdit(QuestionPrevDialog)
41
- self.qNameLine.setObjectName(u"qNameLine")
42
- self.qNameLine.setReadOnly(True)
43
-
44
- self.formLayout.setWidget(0, QFormLayout.FieldRole, self.qNameLine)
45
-
46
- self.label = QLabel(QuestionPrevDialog)
47
- self.label.setObjectName(u"label")
48
-
49
- self.formLayout.setWidget(1, QFormLayout.LabelRole, self.label)
50
-
51
- self.qTypeLine = QLineEdit(QuestionPrevDialog)
52
- self.qTypeLine.setObjectName(u"qTypeLine")
53
- self.qTypeLine.setReadOnly(True)
54
-
55
- self.formLayout.setWidget(1, QFormLayout.FieldRole, self.qTypeLine)
56
-
57
-
58
- self.verticalLayout.addLayout(self.formLayout)
59
-
60
- self.line = QFrame(QuestionPrevDialog)
61
- self.line.setObjectName(u"line")
62
- self.line.setFrameShape(QFrame.Shape.HLine)
63
- self.line.setFrameShadow(QFrame.Shadow.Sunken)
64
-
65
- self.verticalLayout.addWidget(self.line)
66
-
67
- self.questionText = QLabel(QuestionPrevDialog)
68
- self.questionText.setObjectName(u"questionText")
69
- self.questionText.setWordWrap(True)
70
- self.questionText.setMargin(10)
71
-
72
- self.verticalLayout.addWidget(self.questionText)
73
-
74
- self.graphicsView = QGraphicsView(QuestionPrevDialog)
75
- self.graphicsView.setObjectName(u"graphicsView")
76
- brush = QBrush(QColor(231, 243, 245, 255))
77
- brush.setStyle(Qt.SolidPattern)
78
- self.graphicsView.setBackgroundBrush(brush)
79
-
80
- self.verticalLayout.addWidget(self.graphicsView)
81
-
82
- self.answersLabel = QLabel(QuestionPrevDialog)
83
- self.answersLabel.setObjectName(u"answersLabel")
84
-
85
- self.verticalLayout.addWidget(self.answersLabel)
86
-
87
- self.answersFormLayout = QFormLayout()
88
- self.answersFormLayout.setObjectName(u"answersFormLayout")
89
- self.answersFormLayout.setContentsMargins(-1, 3, -1, -1)
90
-
91
- self.verticalLayout.addLayout(self.answersFormLayout)
92
-
93
- self.buttonBox = QDialogButtonBox(QuestionPrevDialog)
94
- self.buttonBox.setObjectName(u"buttonBox")
95
- self.buttonBox.setOrientation(Qt.Orientation.Horizontal)
96
- self.buttonBox.setStandardButtons(QDialogButtonBox.StandardButton.Close)
97
-
98
- self.verticalLayout.addWidget(self.buttonBox)
99
-
100
-
101
- self.retranslateUi(QuestionPrevDialog)
102
- self.buttonBox.accepted.connect(QuestionPrevDialog.accept)
103
- self.buttonBox.rejected.connect(QuestionPrevDialog.reject)
104
-
105
- QMetaObject.connectSlotsByName(QuestionPrevDialog)
106
- # setupUi
107
-
108
- def retranslateUi(self, QuestionPrevDialog):
109
- QuestionPrevDialog.setWindowTitle(QCoreApplication.translate("QuestionPrevDialog", u"Dialog", None))
110
- self.questionNameLabel.setText(QCoreApplication.translate("QuestionPrevDialog", u"Question Name", None))
111
- self.label.setText(QCoreApplication.translate("QuestionPrevDialog", u"Question Type", None))
112
- self.questionText.setText(QCoreApplication.translate("QuestionPrevDialog", u"QuestionText", None))
113
- self.answersLabel.setText(QCoreApplication.translate("QuestionPrevDialog", u"Answers", None))
114
- # retranslateUi
115
-
@@ -1,37 +0,0 @@
1
- excel2moodle/__init__.py,sha256=qdQJY0xbSiEhnmqbgJpqBe0kHec7yLOeAdcArScioE8,1925
2
- excel2moodle/__main__.py,sha256=WAqQPg1DycB7nXK6VwDvnwHxWP5SGGVpQ_beE36l5L8,1190
3
- excel2moodle/logger.py,sha256=e3i6ECB8x-qyR4mP5WhdDGs1WbFXma2tzBjKbMumfOw,3086
4
- excel2moodle/core/__init__.py,sha256=H4Bt6u076RKb6BH5F58nHLQvYPDUoayosM_Onyr9yT0,398
5
- excel2moodle/core/category.py,sha256=QIl8nh1ryvlVMtNy8hWRfhZZMgGOhQZ3rwDFqf4woa4,1809
6
- excel2moodle/core/dataStructure.py,sha256=xEb24WHMSTXnR5JtpLeacfYyBkP418znQXYBTaUix6k,13209
7
- excel2moodle/core/etHelpers.py,sha256=i8DAx7YBxrQqzbXFsU-pIvYMPHSRhYci-JvuzY1MzeI,2299
8
- excel2moodle/core/exceptions.py,sha256=VgbxrnoR9RRnmDYK2rbB_Bv00r7NLWET6FgddPwo3uw,748
9
- excel2moodle/core/globals.py,sha256=Dg46AveftuGTGpxaFdxF87Kc1Azf0dIFQy8dAdgy0cE,3293
10
- excel2moodle/core/numericMultiQ.py,sha256=vr-gYogu2sf2a_Bhvhnu1ZSZFZXM32MfhJesjTkoOQM,2618
11
- excel2moodle/core/parser.py,sha256=biXKznQdrK0_UNBB4TsV54RqTpAmEnGwZJVC5_wneA0,8549
12
- excel2moodle/core/question.py,sha256=mr0T8qc7C-m-A8_A59JeCyu80SmruRB-iTV5JEAHjAk,8599
13
- excel2moodle/core/settings.py,sha256=6Do6A1VWlVMJYgT0Je4YyFsIS8rEMcghu-MUXBGk1b0,6842
14
- excel2moodle/core/stringHelpers.py,sha256=OzFZ6Eu3PeBLKb61K-aeVfUZmVuBerr9KfyOsuNRd7Y,2403
15
- excel2moodle/core/validator.py,sha256=4U0HEJREtZ7d6K7b4F1NA7P_AC3_uv6Th_1YGLKJwgU,4969
16
- excel2moodle/extra/__init__.py,sha256=PM-id60HD21A3IcGC_fCYFihS8osBGZMIJCcN-ZRsIM,293
17
- excel2moodle/extra/equationVerification.py,sha256=GLJl1r90d8AAiNy0H2hooZrg3D6aEwNfifYKAe3aGxM,3921
18
- excel2moodle/question_types/__init__.py,sha256=ZYGg_tYop9c5yUfN8St6FddeaDxbyE2hneKKUFVzcGM,955
19
- excel2moodle/question_types/mc.py,sha256=DEloENXMME7zpHgUIdQlH_HKMyPbWdNs45r05nseQ8c,4804
20
- excel2moodle/question_types/nf.py,sha256=QcLIGFLTOyZyTouOTbSb9oaqXZAo1wYJz-Ek9oqEVHc,773
21
- excel2moodle/question_types/nfm.py,sha256=ndwZdsCb71MrdPGaftqWxD7IuWFNXKRIN7Qcxe1qTHM,3231
22
- excel2moodle/ui/__init__.py,sha256=4EdGtpzwH3rgw4xW9E5x9kdPQYwKbo9rehHRZTNxCrQ,44
23
- excel2moodle/ui/appUi.py,sha256=3uYIuuLJlUhud5yHo8Uiya3ZOlMUlyWVMtFxHU3ZATk,11284
24
- excel2moodle/ui/dialogs.py,sha256=Xvhkvp4U-0yN5dWK9BaP6j3LzeNLd3YMiA1JvtyCZyw,5636
25
- excel2moodle/ui/exportSettingsDialog.py,sha256=_BldaX74LsaAfy4rG6g7f55tra3OQETnfyRQ-wClvHU,3610
26
- excel2moodle/ui/questionPreviewDialog.py,sha256=_rJvz1GM90aNnj3P6SugEezK7JW6m74ZALgkChohWLM,4980
27
- excel2moodle/ui/treewidget.py,sha256=mTRqmZHMZT3QTTvt5Gw9L-yl4KdhhulkF7O1KBwW-_E,2449
28
- excel2moodle/ui/variantDialog.py,sha256=snVaF3_YAc7NWjMRg7NzbjL_PzNbOpt4eiqElkE46io,5414
29
- excel2moodle/ui/windowDoc.py,sha256=WvzHj6F4JvHP82WlTsyFeOXW024Xq3BUqtp--T4twuI,661
30
- excel2moodle/ui/windowEquationChecker.py,sha256=fLyal3sbJwpthWCAxLB5vbSFOX23JoivoYksNp3mZVY,7925
31
- excel2moodle/ui/windowMain.py,sha256=iHEq9HRRGduPIxV4QOYUkGgKkbmphJT1vKHsrokQbsM,19668
32
- excel2moodle-0.4.0.dist-info/licenses/LICENSE,sha256=ywQqe6Sitymkf2lV2NRcx_aGsaC-KbSl_EfEsRXmNRw,35135
33
- excel2moodle-0.4.0.dist-info/METADATA,sha256=xj6dLT6Sf8lT2Cmokk_0Lld_J6HLlrxZa-XXi2lk1m4,2972
34
- excel2moodle-0.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
35
- excel2moodle-0.4.0.dist-info/entry_points.txt,sha256=r6Dy9TGktIJUdr1QpKni_ANneugiuEtLYUbsKVMn96w,117
36
- excel2moodle-0.4.0.dist-info/top_level.txt,sha256=5V1xRUQ9o7UmOCmNoWCZPAuy5nXp3Qbzyqch8fUGT_c,13
37
- excel2moodle-0.4.0.dist-info/RECORD,,