diff --git a/python/educational-core/src/com/jetbrains/edu/coursecreator/CCSubtaskEditorNotificationProvider.java b/python/educational-core/src/com/jetbrains/edu/coursecreator/CCSubtaskEditorNotificationProvider.java index 6189b8c9186f..716580bd0d72 100644 --- a/python/educational-core/src/com/jetbrains/edu/coursecreator/CCSubtaskEditorNotificationProvider.java +++ b/python/educational-core/src/com/jetbrains/edu/coursecreator/CCSubtaskEditorNotificationProvider.java @@ -214,7 +214,7 @@ public class CCSubtaskEditorNotificationProvider extends EditorNotifications.Pro if (activeSubtaskIndex > mySubtaskIndex) { myTask.setActiveSubtaskIndex(activeSubtaskIndex - 1); } - StudySubtaskUtils.updateUI(myProject, myTask, taskDir, true); + StudySubtaskUtils.updateUI(myProject, myTask, true); for (VirtualFile file : FileEditorManager.getInstance(myProject).getOpenFiles()) { EditorNotifications.getInstance(myProject).updateNotifications(file); } diff --git a/python/educational-core/src/com/jetbrains/edu/coursecreator/CCUtils.java b/python/educational-core/src/com/jetbrains/edu/coursecreator/CCUtils.java index 1de771517bb8..6cb6874a0d7d 100644 --- a/python/educational-core/src/com/jetbrains/edu/coursecreator/CCUtils.java +++ b/python/educational-core/src/com/jetbrains/edu/coursecreator/CCUtils.java @@ -42,6 +42,7 @@ import java.util.Map; public class CCUtils { public static final String ANSWER_EXTENSION_DOTTED = ".answer."; + public static final String TASK_DESCRIPTION_TEXT = "Write task description here using markdown or html"; private static final Logger LOG = Logger.getInstance(CCUtils.class); public static final String GENERATED_FILES_FOLDER = ".coursecreator"; public static final String COURSE_MODE = "Course Creator"; diff --git a/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCCreateTask.java b/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCCreateTask.java index 6f71b3514188..56c05d024f25 100644 --- a/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCCreateTask.java +++ b/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCCreateTask.java @@ -1,15 +1,12 @@ package com.jetbrains.edu.coursecreator.actions; import com.intellij.ide.IdeView; -import com.intellij.ide.fileTemplates.FileTemplate; -import com.intellij.ide.fileTemplates.FileTemplateManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.util.Function; -import com.jetbrains.edu.coursecreator.settings.CCSettings; +import com.jetbrains.edu.coursecreator.CCUtils; import com.jetbrains.edu.learning.EduPluginConfigurator; -import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.core.EduNames; import com.jetbrains.edu.learning.core.EduUtils; import com.jetbrains.edu.learning.courseFormat.Course; @@ -120,11 +117,7 @@ public class CCCreateTask extends CCCreateStudyItemActionBase { return null; } task.setLesson(((Lesson)parentItem)); - String fileName = StudyUtils.getTaskDescriptionFileName(CCSettings.getInstance().useHtmlAsDefaultTaskFormat()); - FileTemplate template = FileTemplateManager.getDefaultInstance().getInternalTemplate(fileName); - if (template != null) { - task.addTaskText(fileName, template.getText()); - } + task.addTaskText(task.getTaskDescriptionNameWithoutExtension(), CCUtils.TASK_DESCRIPTION_TEXT); return task; } } \ No newline at end of file diff --git a/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCEditTaskTextAction.java b/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCEditTaskTextAction.java index d0ba30dd4093..d299f0eb2e36 100644 --- a/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCEditTaskTextAction.java +++ b/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCEditTaskTextAction.java @@ -4,7 +4,6 @@ import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.ToggleAction; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditorManager; @@ -60,27 +59,11 @@ public class CCEditTaskTextAction extends ToggleAction implements DumbAware { StudyTaskManager.getInstance(project).setTurnEditingMode(true); return; } - VirtualFile taskDir = task.getTaskDir(project); - if (taskDir == null) { - StudyTaskManager.getInstance(project).setTurnEditingMode(true); - return; - } - VirtualFile taskTextFile = StudyUtils.findTaskDescriptionVirtualFile(project, taskDir); - if (taskTextFile == null) { - LOG.info("Failed to find task.html"); - StudyTaskManager.getInstance(project).setTurnEditingMode(true); - return; - } - Document document = FileDocumentManager.getInstance().getDocument(taskTextFile); if (!state) { - if (document != null) { - FileDocumentManager.getInstance().saveDocument(document); - task.addTaskText(taskTextFile.getName(), document.getText()); - } window.leaveEditingMode(project); return; } - window.enterEditingMode(taskTextFile, project); + window.enterEditingMode(project); } @Override diff --git a/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCNewSubtaskAction.java b/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCNewSubtaskAction.java index 7d7256e3d51f..a52cd28b7159 100644 --- a/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCNewSubtaskAction.java +++ b/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCNewSubtaskAction.java @@ -1,28 +1,18 @@ package com.jetbrains.edu.coursecreator.actions; -import com.intellij.ide.fileTemplates.FileTemplate; -import com.intellij.ide.fileTemplates.FileTemplateManager; -import com.intellij.ide.fileTemplates.FileTemplateUtil; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.Presentation; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiManager; import com.jetbrains.edu.coursecreator.CCUtils; -import com.jetbrains.edu.coursecreator.settings.CCSettings; import com.jetbrains.edu.learning.EduPluginConfigurator; import com.jetbrains.edu.learning.StudySubtaskUtils; import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyUtils; -import com.jetbrains.edu.learning.core.EduNames; import com.jetbrains.edu.learning.courseFormat.Course; import com.jetbrains.edu.learning.courseFormat.Lesson; import com.jetbrains.edu.learning.courseFormat.TaskFile; @@ -36,7 +26,6 @@ import static com.jetbrains.edu.coursecreator.CCUtils.renameFiles; public class CCNewSubtaskAction extends DumbAwareAction { - private static final Logger LOG = Logger.getInstance(CCNewSubtaskAction.class); public static final String NEW_SUBTASK = "Add Subtask"; public CCNewSubtaskAction() { @@ -82,7 +71,6 @@ public class CCNewSubtaskAction extends DumbAwareAction { } createTestsForNewSubtask(project, task); int num = task.getLastSubtaskIndex() + 1; - createTaskDescriptionFile(project, taskDir, num); StudySubtaskUtils.switchStep(project, task, num, false); task.setLastSubtaskIndex(num); } @@ -99,24 +87,6 @@ public class CCNewSubtaskAction extends DumbAwareAction { configurator.createTestsForNewSubtask(project, task); } - private static void createTaskDescriptionFile(Project project, VirtualFile taskDir, int index) { - String taskDescriptionFileName = StudyUtils.getTaskDescriptionFileName(CCSettings.getInstance().useHtmlAsDefaultTaskFormat()); - FileTemplate taskTextTemplate = FileTemplateManager.getInstance(project).getInternalTemplate(taskDescriptionFileName); - PsiDirectory taskPsiDir = PsiManager.getInstance(project).findDirectory(taskDir); - if (taskTextTemplate != null && taskPsiDir != null) { - String nextTaskTextName = FileUtil.getNameWithoutExtension(taskDescriptionFileName) + - EduNames.SUBTASK_MARKER + - index + "." + - FileUtilRt.getExtension(taskDescriptionFileName); - try { - FileTemplateUtil.createFromTemplate(taskTextTemplate, nextTaskTextName, null, taskPsiDir); - } - catch (Exception e) { - LOG.error(e); - } - } - } - @Override public void update(AnActionEvent e) { DataContext dataContext = e.getDataContext(); diff --git a/python/educational-core/src/com/jetbrains/edu/learning/StudyFileEditorManagerListener.java b/python/educational-core/src/com/jetbrains/edu/learning/StudyFileEditorManagerListener.java index 1eac1fb00a97..c462eedc7ac7 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/StudyFileEditorManagerListener.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/StudyFileEditorManagerListener.java @@ -24,8 +24,8 @@ public class StudyFileEditorManagerListener implements FileEditorManagerListener @Override public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) { Task task = getTask(file); - setTaskText(task, StudyUtils.getTaskDir(file)); if (task != null) { + setTaskText(task.getTaskDescription()); if (task instanceof ChoiceTask) { final StudyChoiceVariantsPanel choicePanel = new StudyChoiceVariantsPanel((ChoiceTask)task); myToolWindow.setBottomComponent(choicePanel); @@ -51,7 +51,7 @@ public class StudyFileEditorManagerListener implements FileEditorManagerListener VirtualFile file = event.getNewFile(); if (file != null) { Task task = getTask(file); - setTaskText(task, StudyUtils.getTaskDir(file)); + setTaskText(task == null ? null : task.getTaskDescription()); } myToolWindow.setBottomComponent(null); } @@ -61,12 +61,11 @@ public class StudyFileEditorManagerListener implements FileEditorManagerListener return StudyUtils.getTaskForFile(myProject, file); } - private void setTaskText(@Nullable final Task task, @Nullable final VirtualFile taskDirectory) { - String text = StudyUtils.getTaskTextFromTask(taskDirectory, task); + private void setTaskText(@Nullable String text) { if (text == null) { myToolWindow.setEmptyText(myProject); return; } - myToolWindow.setTaskText(text, taskDirectory, myProject); + myToolWindow.setTaskText(text, myProject); } } \ No newline at end of file diff --git a/python/educational-core/src/com/jetbrains/edu/learning/StudySubtaskUtils.java b/python/educational-core/src/com/jetbrains/edu/learning/StudySubtaskUtils.java index 2f9e9968cb70..8f625fe208f6 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/StudySubtaskUtils.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/StudySubtaskUtils.java @@ -90,7 +90,7 @@ public class StudySubtaskUtils { } transformTestFile(project, toSubtaskIndex, taskDir); task.setActiveSubtaskIndex(toSubtaskIndex); - updateUI(project, task, taskDir, !CCUtils.isCourseCreator(project) && navigateToTask); + updateUI(project, task, !CCUtils.isCourseCreator(project) && navigateToTask); if (CCUtils.isCourseCreator(project)) { updateOpenedTestFiles(project, taskDir, fromSubtaskIndex, toSubtaskIndex); } @@ -161,17 +161,17 @@ public class StudySubtaskUtils { return nameWithoutExtension + EduNames.SUBTASK_MARKER + subtaskIndex + "." + extension; } - public static void updateUI(@NotNull Project project, @NotNull Task task, VirtualFile taskDir, boolean navigateToTask) { + public static void updateUI(@NotNull Project project, @NotNull Task task, boolean navigateToTask) { StudyCheckUtils.drawAllPlaceholders(project, task); ProjectView.getInstance(project).refresh(); StudyToolWindow toolWindow = StudyUtils.getStudyToolWindow(project); if (toolWindow != null) { - String text = StudyUtils.getTaskTextFromTask(taskDir, task); + String text = task.getTaskDescription(); if (text == null) { - toolWindow.setEmptyText(project); - return; + task.addTaskText(task.getTaskDescriptionNameWithoutExtension(), CCUtils.TASK_DESCRIPTION_TEXT); + text = CCUtils.TASK_DESCRIPTION_TEXT; } - toolWindow.setTaskText(text, taskDir, project); + toolWindow.setTaskText(text, project); } if (navigateToTask) { StudyNavigator.navigateToTask(project, task); diff --git a/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java b/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java index 8d4b49d9472e..699b86d528de 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java @@ -24,7 +24,6 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; -import com.intellij.openapi.fileEditor.impl.LoadTextUtil; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; @@ -49,7 +48,6 @@ import com.intellij.ui.JBColor; import com.intellij.ui.awt.RelativePoint; import com.intellij.ui.content.Content; import com.intellij.util.DocumentUtil; -import com.intellij.util.ObjectUtils; import com.intellij.util.TimeoutUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.text.MarkdownUtil; @@ -62,12 +60,8 @@ import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder; import com.jetbrains.edu.learning.courseFormat.Course; import com.jetbrains.edu.learning.courseFormat.Lesson; import com.jetbrains.edu.learning.courseFormat.TaskFile; -import com.jetbrains.edu.learning.courseFormat.tasks.ChoiceTask; import com.jetbrains.edu.learning.courseFormat.tasks.Task; -import com.jetbrains.edu.learning.courseFormat.tasks.TaskWithSubtasks; -import com.jetbrains.edu.learning.courseFormat.tasks.TheoryTask; import com.jetbrains.edu.learning.editor.StudyEditor; -import com.jetbrains.edu.learning.stepic.EduStepikUtils; import com.jetbrains.edu.learning.stepic.OAuthDialog; import com.jetbrains.edu.learning.stepic.StepicUser; import com.jetbrains.edu.learning.ui.StudyStepicUserWidget; @@ -188,7 +182,7 @@ public class StudyUtils { if (studyToolWindow != null) { String taskText = getTaskText(project); if (taskText != null) { - studyToolWindow.setTaskText(taskText, null, project); + studyToolWindow.setTaskText(taskText, project); } else { LOG.warn("Task text is null"); @@ -406,93 +400,11 @@ public class StudyUtils { return !isRenameableOrMoveable(project, course, element); } - @Nullable - public static String getTaskTextFromTask(@Nullable final VirtualFile taskDirectory, @Nullable final Task task) { - if (task == null || task.getLesson() == null || task.getLesson().getCourse() == null) { - return null; - } - final Course course = task.getLesson().getCourse(); - String text = task.getTaskDescription() != null ? task.getTaskDescription() : getTaskTextByTaskName(task, taskDirectory); - - if (text == null) return null; - if (course.isAdaptive()) text = wrapAdaptiveCourseText(task, text); - - return wrapTextToDisplayLatex(text); - } - - @NotNull - public static String constructTaskTextFilename(@NotNull Task task, @NotNull String defaultName) { - String fileNameWithoutExtension = FileUtil.getNameWithoutExtension(defaultName); - if (task instanceof TaskWithSubtasks) { - int activeStepIndex = ((TaskWithSubtasks)task).getActiveSubtaskIndex(); - fileNameWithoutExtension += EduNames.SUBTASK_MARKER + activeStepIndex; - } - return addExtension(fileNameWithoutExtension, defaultName); - } - - private static String wrapAdaptiveCourseText(Task task, @NotNull String text) { - String finalText = text; - if (task instanceof TheoryTask) { - finalText += "\n\nNote: This theory task aims to help you solve difficult tasks. " + - "Please, read it and press \"Check\" to go further."; - } - else if (!(task instanceof ChoiceTask)) { - finalText += "\n\nNote: Use standard input to obtain input for the task."; - } - finalText += getFooterWithLink(task); - - return finalText; - } - - @NotNull - private static String getFooterWithLink(Task task) { - return - "
"; - } - - @NotNull - private static String addExtension(@NotNull String fileNameWithoutExtension, @NotNull String defaultName) { - return fileNameWithoutExtension + "." + FileUtilRt.getExtension(defaultName); - } - public static String wrapTextToDisplayLatex(String taskTextFileHtml) { final String prefix = String.format(ourPrefix, EditorColorsManager.getInstance().getGlobalScheme().getEditorFontSize()); return prefix + taskTextFileHtml + ourPostfix; } - @Nullable - private static String getTaskTextByTaskName(@NotNull Task task, @Nullable VirtualFile taskDirectory) { - if (taskDirectory == null) return null; - - String textFromHtmlFile = getTextByTaskFileFormat(task, taskDirectory, EduNames.TASK_HTML); - if (textFromHtmlFile != null) { - return textFromHtmlFile; - } - - String taskTextFromMd = getTextByTaskFileFormat(task, taskDirectory, EduNames.TASK_HTML); - return convertToHtml(taskTextFromMd); - } - - @Nullable - private static String getTextByTaskFileFormat(@NotNull Task task, @NotNull VirtualFile taskDirectory, @NotNull String taskTextFileName) { - String textFilename = constructTaskTextFilename(task, taskTextFileName); - VirtualFile taskTextFile = taskDirectory.findChild(textFilename); - - if (taskTextFile != null) { - return String.valueOf(LoadTextUtil.loadText(taskTextFile)); - } - - VirtualFile srcDir = taskDirectory.findChild(EduNames.SRC); - if (srcDir != null) { - VirtualFile taskTextSrcFile = srcDir.findChild(textFilename); - if (taskTextSrcFile != null) { - return String.valueOf(LoadTextUtil.loadText(taskTextSrcFile)); - } - } - - return null; - } - @Nullable public static StudyTwitterPluginConfigurator getTwitterConfigurator(@NotNull final Project project) { StudyTwitterPluginConfigurator[] extensions = StudyTwitterPluginConfigurator.EP_NAME.getExtensions(); @@ -506,20 +418,11 @@ public class StudyUtils { @Nullable public static String getTaskText(@NotNull final Project project) { - Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); - if (editor == null) { + Task task = getCurrentTask(project); + if (task == null) { return StudyToolWindow.EMPTY_TASK_TEXT; } - Document document = editor.getDocument(); - VirtualFile virtualFile = FileDocumentManager.getInstance().getFile(document); - if (virtualFile == null) { - return StudyToolWindow.EMPTY_TASK_TEXT; - } - final Task task = getTaskForFile(project, virtualFile); - if (task != null) { - return getTaskTextFromTask(task.getTaskDir(project), task); - } - return null; + return task.getTaskDescription(); } @Nullable @@ -635,9 +538,7 @@ public class StudyUtils { return task; } - @Nullable - public static String convertToHtml(@Nullable final String content) { - if (content == null) return null; + public static String convertToHtml(@NotNull String content) { ArrayList