intellij-plugin/educational-core/resources/META-INF/educational-core.xml (473 lines of code) (raw):
<idea-plugin xmlns:xi="http://www.w3.org/2001/XInclude">
<!--suppress PluginXmlValidity -->
<dependencies>
<plugin id="com.intellij.modules.lang"/>
<!-- The vcs module is needed to be sure that IgnoreFileType, PatternCache exist which are used for .courseignore support -->
<plugin id="com.intellij.modules.vcs"/>
</dependencies>
<resource-bundle>messages.EduCoreBundle</resource-bundle>
<applicationListeners>
<listener class="com.jetbrains.edu.learning.EduDynamicPluginListener"
topic="com.intellij.ide.plugins.DynamicPluginListener"/>
<listener class="com.jetbrains.edu.learning.InitializationListener" topic="com.intellij.ide.AppLifecycleListener"/>
<listener class="com.jetbrains.edu.learning.InitializationListener" topic="com.intellij.ide.plugins.DynamicPluginListener"/>
<listener class="com.jetbrains.edu.learning.RecentPreviewCourseListener"
topic="com.intellij.openapi.project.ProjectManagerListener"/>
<listener class="com.jetbrains.edu.learning.RecentPreviewCourseListener"
topic="com.intellij.ide.AppLifecycleListener"/>
</applicationListeners>
<projectListeners>
<listener class="com.jetbrains.edu.learning.checker.FixModuleForRunConfigurationsListener"
topic="com.intellij.execution.RunManagerListener"/>
<listener class="com.jetbrains.edu.learning.checker.PreventRunConfigurationsRenameListener"
topic="com.intellij.execution.RunManagerListener"/>
<listener class="com.jetbrains.edu.learning.checker.FixModuleForRunConfigurationsListener"
topic="com.intellij.openapi.roots.ModuleRootListener"/>
<listener class="com.jetbrains.edu.learning.yaml.YamlLoadingErrorManager$Listener"
topic="com.jetbrains.edu.learning.yaml.YamlListener"/>
<listener class="com.jetbrains.edu.learning.taskToolWindow.EduFileEditorManagerListener"
topic="com.intellij.openapi.fileEditor.FileEditorManagerListener"/>
<listener class="com.jetbrains.edu.learning.taskToolWindow.EduFileEditorManagerListener"
topic="com.intellij.openapi.fileEditor.FileEditorManagerListener$Before"/>
<listener class="com.jetbrains.edu.learning.storage.LearningObjectsPersister"
topic="com.jetbrains.edu.learning.CourseSetListener"/>
<listener class="com.jetbrains.edu.learning.marketplace.lti.LTICourseSetListener"
topic="com.jetbrains.edu.learning.CourseSetListener"/>
</projectListeners>
<extensionPoints>
<extensionPoint qualifiedName="Educational.configurator"
beanClass="com.jetbrains.edu.learning.configuration.EducationalExtensionPoint"
dynamic="true">
<with attribute="implementationClass" implements="com.jetbrains.edu.learning.configuration.EduConfigurator"/>
</extensionPoint>
<extensionPoint qualifiedName="Educational.compatibilityProvider"
beanClass="com.jetbrains.edu.learning.compatibility.CourseCompatibilityProviderEP"
dynamic="true">
<with attribute="implementationClass" implements="com.jetbrains.edu.learning.compatibility.CourseCompatibilityProvider"/>
</extensionPoint>
<extensionPoint qualifiedName="Educational.remoteTaskChecker"
interface="com.jetbrains.edu.learning.checker.remote.RemoteTaskChecker"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.checkListener"
interface="com.jetbrains.edu.learning.checker.CheckListener"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.submissionsProvider"
interface="com.jetbrains.edu.learning.submissions.provider.SubmissionsProvider"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.communitySubmissionsProvider"
interface="com.jetbrains.edu.learning.submissions.provider.CommunitySubmissionsProvider"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.optionsProvider"
beanClass="com.intellij.openapi.options.ConfigurableEP"
dynamic="true">
<with attribute="instance" implements="com.jetbrains.edu.learning.settings.OptionsProvider"/>
</extensionPoint>
<extensionPoint qualifiedName="Educational.coursesPlatformProviderFactory"
interface="com.jetbrains.edu.learning.newproject.ui.CoursesPlatformProviderFactory"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.pathMacroProvider"
interface="com.jetbrains.edu.learning.courseGeneration.macro.EduMacroProvider"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.postToGithub"
interface="com.jetbrains.edu.learning.github.PostToGithubActionProvider"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.taskNavigationExtension"
interface="com.jetbrains.edu.learning.navigation.TaskNavigationExtension"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.navigateToConfigEntryForEduFile"
interface="com.jetbrains.edu.learning.navigation.NavigateToConfigEntryForEduFileExtension"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.revertTaskExtension"
interface="com.jetbrains.edu.learning.actions.RevertTaskAction$RevertTaskExtension"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.yamlActionsHelper"
interface="com.jetbrains.edu.coursecreator.actions.YamlActionsHelper"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.courseViewPaneCustomization"
interface="com.jetbrains.edu.learning.projectView.CourseViewPaneCustomization"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.studyItemRefactoringHandler"
interface="com.jetbrains.edu.coursecreator.handlers.StudyItemRefactoringHandler"
dynamic="true"/>
<extensionPoint qualifiedName="Educational.courseMetadataProcessor"
interface="com.jetbrains.edu.learning.newproject.CourseMetadataProcessor"
dynamic="true"/>
</extensionPoints>
<actions>
<action id="Educational.Agreement.ShowUserAgreementDialog"
class="com.jetbrains.edu.learning.agreement.action.ShowUserAgreementDialog"
internal="true"/>
<action id="Educational.Agreement.ResetUserAgreementSettings"
class="com.jetbrains.edu.learning.agreement.action.ResetUserAgreementSettings"
internal="true"/>
<action id="Educational.ImportLocalCourse" class="com.jetbrains.edu.learning.actions.ImportLocalCourseAction"/>
<action id="Educational.Check" class="com.jetbrains.edu.learning.actions.CheckAction"/>
<action id="Educational.Run"
class="com.jetbrains.edu.learning.actions.RunTaskAction"
icon="AllIcons.Actions.Execute"/>
<action id="Educational.AssignRunConfigurationToTask"
class="com.jetbrains.edu.learning.actions.AssignRunConfigurationToTask">
<add-to-group group-id="RunConfiguration.Group" anchor="before" relative-to-action="DeleteRunConfiguration"/> <!-- top right -->
</action>
<action id="Educational.Retry" class="com.jetbrains.edu.learning.actions.RetryAction"/>
<action id="Educational.PrevPlaceholder"
class="com.jetbrains.edu.learning.actions.PrevPlaceholderAction"
icon="AllIcons.Actions.Back"/>
<action id="Educational.NextPlaceholder"
class="com.jetbrains.edu.learning.actions.NextPlaceholderAction"
icon="AllIcons.Actions.Forward"/>
<action id="Educational.PreviousTask"
class="com.jetbrains.edu.learning.actions.PreviousTaskAction"
icon="AllIcons.Actions.Back"/>
<action id="Educational.NextTask"
class="com.jetbrains.edu.learning.actions.NextTaskAction"
icon="AllIcons.Actions.Forward"/>
<action id="Educational.RefreshTask"
class="com.jetbrains.edu.learning.actions.RevertTaskAction"
icon="com.jetbrains.edu.EducationalCoreIcons.Actions.ResetTask"/>
<action id="Educational.LeaveFeedbackAction"
class="com.jetbrains.edu.learning.actions.LeaveFeedbackAction"
icon="com.jetbrains.edu.EducationalCoreIcons.Actions.CommentTask"/>
<action id="Educational.OpenTaskOnSiteAction" class="com.jetbrains.edu.learning.actions.OpenTaskOnSiteAction"/>
<action id="Educational.CompareWithAnswer"
class="com.jetbrains.edu.learning.actions.CompareWithAnswerAction"
icon="AllIcons.Actions.Diff"/>
<action id="Educational.RefreshAnswerPlaceholder"
class="com.jetbrains.edu.learning.actions.RefreshAnswerPlaceholder"
icon="AllIcons.Actions.Refresh">
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
</action>
<action id="Educational.SwitchTaskDescriptionPanel" class="com.jetbrains.edu.learning.actions.SwitchTaskPanelAction">
</action>
<action id="Educational.UpdateCoursePreview"
class="com.jetbrains.edu.coursecreator.actions.CCUpdateCoursePreview"
internal="true"/>
<!-- IMPORTANT: don't change the action id, it's used in monorepo-->
<action id="Educational.BrowseCourses" class="com.jetbrains.edu.learning.newproject.BrowseCoursesAction"/>
<action id="Educational.ToggleRestServices"
class="com.jetbrains.edu.learning.actions.ToggleRestServicesAction"
internal="true"/>
<!--educator actions-->
<action id="Educational.Educator.InsertShortcut" class="com.jetbrains.edu.coursecreator.actions.InsertShortcutAction">
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
</action>
<action id="Educational.Educator.NewCourse" class="com.jetbrains.edu.coursecreator.actions.CCNewCourseAction"/>
<action id="Educational.CCEditTaskDescription" class="com.jetbrains.edu.coursecreator.actions.CCEditTaskDescription"/>
<action id="LessonCard-left" class="com.intellij.openapi.actionSystem.EmptyAction" use-shortcut-of="EditorLeft"/>
<action id="LessonCard-right" class="com.intellij.openapi.actionSystem.EmptyAction" use-shortcut-of="EditorRight"/>
<group id="Educational.Educator.NewFile">
<action id="Educational.Educator.CreateTask" class="com.jetbrains.edu.coursecreator.actions.studyItem.CCCreateTask"/>
<action id="Educational.Educator.CreateLesson"
class="com.jetbrains.edu.coursecreator.actions.studyItem.CCCreateLesson"/>
<action id="Educational.Educator.CreateSection"
class="com.jetbrains.edu.coursecreator.actions.studyItem.CCCreateSection"/>
<separator/>
<!-- Adding to necessary action groups happens in com.jetbrains.edu.learning.InitializationListener -->
</group>
<action id="Educational.Educator.ChangeCourseInfo" class="com.jetbrains.edu.coursecreator.actions.CCChangeCourseInfo"/>
<action id="Educational.Educator.CheckAllTasks" class="com.jetbrains.edu.coursecreator.actions.checkAllTasks.CCCheckAllTasksAction"/>
<action class="com.jetbrains.edu.coursecreator.actions.CCCreateCoursePreview" id="Educational.Educator.CreateCoursePreview"/>
<action id="Educational.Educator.RegenerateDuplicateIds"
class="com.jetbrains.edu.coursecreator.actions.marketplace.RegenerateDuplicateIds"/>
<group id="Educational.Educator.CourseCreator.FrameworkLesson" popup="false"
class="com.jetbrains.edu.coursecreator.actions.CCFrameworkLessonActionGroup">
<action id="Educational.Educator.SyncChangesWithNextTasks"
class="com.jetbrains.edu.coursecreator.actions.CCSyncChangesWithNextTasks"
icon="com.jetbrains.edu.EducationalCoreIcons.Actions.SyncChanges">
</action>
<action id="Educational.Educator.AllowFileToSyncChanges"
class="com.jetbrains.edu.coursecreator.actions.taskFile.CCAllowFileSyncChanges"
icon="AllIcons.Actions.Show"/>
<action id="Educational.Educator.IgnoreFilePropagation"
class="com.jetbrains.edu.coursecreator.actions.taskFile.CCIgnoreFileInSyncChanges"
icon="com.jetbrains.edu.EducationalCoreIcons.Actions.IgnoreSyncFile"/>
<action id="Educational.Educator.ShowUnsyncedChanges"
class="com.jetbrains.edu.coursecreator.actions.taskFile.CCShowUnsyncedChanges"
icon="AllIcons.Actions.Diff"
internal="true">
</action>
<separator/>
<!-- Adding to necessary action groups happens in com.jetbrains.edu.learning.InitializationListener -->
</group>
<group id="Educational.Educator.CourseCreator.Menu" popup="true"
class="com.jetbrains.edu.coursecreator.actions.CCProjectViewActionGroup">
<action id="Educational.Educator.ShowToStudent" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCMakeVisibleToLearner"/>
<action id="Educational.Educator.HideFromStudent" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCHideFromLearner"/>
<action id="Educational.Educator.ShowPreview" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCShowPreview">
<add-to-group group-id="EditorTabPopupMenu"/>
</action>
<action id="Educational.Educator.CCWrapWithSection" class="com.jetbrains.edu.coursecreator.actions.studyItem.CCWrapWithSection"/>
<action id="Educational.Educator.CCRemoveSection" class="com.jetbrains.edu.coursecreator.actions.studyItem.CCRemoveSection"/>
<action id="Educational.Educator.IncludeIntoTask" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCIncludeIntoTask"/>
<action id="Educational.Educator.ExcludeFromTask" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCExcludeFromTask"/>
<action id="Educational.Educator.IncludeIntoArchive" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCIncludeIntoArchive"/>
<action id="Educational.Educator.ExcludeFromArchive" class="com.jetbrains.edu.coursecreator.actions.taskFile.CCExcludeFromArchive"/>
<separator/>
<reference ref="Educational.Educator.CreateCoursePreview"/>
<reference ref="Educational.Educator.ChangeCourseInfo"/>
<reference ref="Educational.Educator.CheckAllTasks"/>
<action id="Educational.Educator.PackCourse" class="com.jetbrains.edu.coursecreator.actions.CCCreateCourseArchiveAction"/>
<!-- Adding to necessary action groups happens in com.jetbrains.edu.learning.InitializationListener -->
</group>
<action id="Educational.Educator.ExportStepikIds" class="com.jetbrains.edu.coursecreator.actions.stepik.ExportStepikIds"/>
<group id="Educational.Educator.AnswerPlaceholder">
<action id="Educational.Educator.AddAnswerPlaceholder"
class="com.jetbrains.edu.coursecreator.actions.placeholder.CCAddAnswerPlaceholder"/>
<group id="Educational.Educator.ModifyAnswerPlaceholder" popup="true" text="Answer Placeholder"
class="com.jetbrains.edu.coursecreator.CCAnswerPlaceholderActionGroup">
<action id="Educational.Educator.EditAnswerPlaceholder"
class="com.jetbrains.edu.coursecreator.actions.placeholder.CCEditAnswerPlaceholder"/>
<action id="Educational.Educator.RemoveDependency" class="com.jetbrains.edu.coursecreator.actions.placeholder.CCRemoveDependency"/>
<action id="Educational.Educator.DeleteAnswerPlaceholder"
class="com.jetbrains.edu.coursecreator.actions.placeholder.CCDeleteAnswerPlaceholder"/>
<action id="Educational.Educator.DeleteAllPlaceholders"
class="com.jetbrains.edu.coursecreator.actions.placeholder.CCDeleteAllAnswerPlaceholdersAction"/>
<separator/>
</group>
<separator/>
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
</group>
<action id="Educational.Educator.EditCourseFromArchive" class="com.jetbrains.edu.coursecreator.actions.CCEditCourseArchive"/>
<action id="Educational.Educator.StepikChangeHost"
class="com.jetbrains.edu.learning.stepik.changeHost.StepikChangeHost"
internal="true"/>
<action id="Educational.Hyperskill.InstallHyperskillPlugin" class="com.jetbrains.edu.learning.stepik.hyperskill.actions.InstallHyperskillPluginAction"/>
<group id="Educational.LearnAndTeachFileMenu"
class="com.jetbrains.edu.learning.newproject.LearnAndTeachFileMenuGroup"
popup="true"
icon="com.jetbrains.edu.EducationalCoreIcons.Actions.EduCourse">
<reference ref="Educational.BrowseCourses"/>
<reference ref="Educational.Educator.NewCourse"/>
<!-- Adding to necessary action groups happens in com.jetbrains.edu.learning.InitializationListener -->
</group>
<action id="Educational.WatchTutorial" class="com.jetbrains.edu.learning.actions.LearnMoreAction">
<add-to-group group-id="HelpMenu" anchor="before" relative-to-action="HelpTopics"/>
</action>
<action id="Educational.SolveAllTasksBefore" class="com.jetbrains.edu.coursecreator.actions.CCSolveAllTasksBeforeAction"/>
<action id="Educational.CreateNewIssue"
class="com.jetbrains.edu.learning.actions.CreateNewYouTrackIssue"
icon="com.jetbrains.edu.EducationalCoreIcons.Actions.EduCourse">
<add-to-group group-id="HelpMenu" anchor="after" relative-to-action="ReportProblem"/>
</action>
<action id="Educational.Student.ApplyCode"
class="com.jetbrains.edu.learning.actions.ApplyCodeAction"
icon="com.jetbrains.edu.EducationalCoreIcons.Actions.ApplyCode">
<add-to-group group-id="Diff.ViewerToolbar"/>
<keyboard-shortcut
keymap="$default"
first-keystroke="control alt shift A"
/>
</action>
<action id="Educational.Educator.OpenEducatorHelp"
class="com.jetbrains.edu.coursecreator.ui.CCOpenEducatorHelp"/>
<group id="Educational.CourseView.SecondaryActions">
<action id="Educational.HideSolvedLessons"
class="com.jetbrains.edu.learning.projectView.CourseViewPane$HideSolvedLessonsAction"/>
</group>
<!-- Actions located in the right corner of the Course View header -->
<group id="Educational.CourseView.Header.Right">
<reference ref="Educational.Educator.CreateCoursePreview"/>
<reference ref="Educational.Educator.OpenEducatorHelp"/>
</group>
<action id="Educational.LeaveInIdeFeedbackAction"
class="com.jetbrains.edu.learning.actions.LeaveInIdeFeedbackAction"
icon="com.jetbrains.edu.EducationalCoreIcons.Actions.CommentTask"/>
<group id="Educational.CheckPanel.Left">
<reference ref="Educational.Run"/>
</group>
<group id="Educational.CheckPanel.Right">
<reference ref="Educational.RefreshTask"/>
<reference ref="Educational.LeaveInIdeFeedbackAction"/>
<reference ref="Educational.LeaveFeedbackAction"/>
</group>
<!-- Actions located in the right corner of Task tool window -->
<group id="Educational.TaskToolWindowView.TitleActions">
<reference ref="Educational.CCEditTaskDescription"/>
<reference ref="Educational.PreviousTask"/>
<reference ref="Educational.NextTask"/>
</group>
</actions>
<extensions defaultExtensionNs="com.intellij">
<applicationService serviceImplementation="com.jetbrains.edu.learning.agreement.UserAgreementSettings"/>
<applicationService serviceInterface="com.jetbrains.edu.learning.EduBrowser"
serviceImplementation="com.jetbrains.edu.learning.EduBrowser"
testServiceImplementation="com.jetbrains.edu.learning.MockEduBrowser"/>
<applicationService serviceInterface="com.jetbrains.edu.learning.stepik.api.StepikConnector"
serviceImplementation="com.jetbrains.edu.learning.stepik.api.StepikConnectorImpl"
testServiceImplementation="com.jetbrains.edu.learning.stepik.api.MockStepikConnector"/>
<applicationService serviceImplementation="com.jetbrains.edu.coursecreator.settings.CCSettings"/>
<applicationService serviceImplementation="com.jetbrains.edu.learning.ai.terms.TheoryLookupSettings"/>
<applicationService serviceInterface="com.jetbrains.edu.learning.courseGeneration.ProjectOpener"
serviceImplementation="com.jetbrains.edu.learning.courseGeneration.ProjectOpenerImpl"
testServiceImplementation="com.jetbrains.edu.learning.MockProjectOpener"/>
<projectService serviceInterface="com.jetbrains.edu.learning.taskToolWindow.ui.TaskToolWindowView"
serviceImplementation="com.jetbrains.edu.learning.taskToolWindow.ui.TaskToolWindowViewImpl"
testServiceImplementation="com.jetbrains.edu.learning.taskToolWindow.ui.MockTaskToolWindowView"/>
<projectService serviceInterface="com.jetbrains.edu.learning.checker.details.CheckDetailsView"
serviceImplementation="com.jetbrains.edu.learning.checker.details.CheckDetailsViewImpl"
headlessImplementation="com.jetbrains.edu.learning.checker.details.MockCheckDetailsView"
testServiceImplementation="com.jetbrains.edu.learning.checker.details.MockCheckDetailsView"/>
<projectService serviceInterface="com.jetbrains.edu.learning.framework.FrameworkLessonManager"
serviceImplementation="com.jetbrains.edu.learning.framework.impl.FrameworkLessonManagerImpl"/>
<!-- Courseignore lang -->
<fileType language="CourseIgnore" fileNames=".courseignore" fieldName="INSTANCE" name="CourseIgnore file"
implementationClass="com.jetbrains.edu.coursecreator.courseignore.CourseIgnoreFileType"/>
<lang.parserDefinition language="CourseIgnore"
implementationClass="com.intellij.openapi.vcs.changes.ignore.lang.IgnoreParserDefinition"/>
<codeInsight.lineMarkerProvider language="CourseIgnore"
implementationClass="com.intellij.openapi.vcs.changes.ignore.codeInsight.IgnoreDirectoryMarkerProvider"/>
<lang.braceMatcher language="CourseIgnore" implementationClass="com.intellij.openapi.vcs.changes.ignore.lang.IgnoreBraceMatcher"/>
<lang.commenter language="CourseIgnore" implementationClass="com.intellij.openapi.vcs.changes.ignore.lang.IgnoreCommenter"/>
<!--END of Courseignore lang-->
<postStartupActivity implementation="com.jetbrains.edu.learning.EduProjectActivity"/>
<postStartupActivity implementation="com.jetbrains.edu.learning.agreement.UserAgreementProjectActivity"/>
<registryKey key="edu.task.description.update.delay"
description="The delay in ms before loading page by Task Description view. \nRequires project reopening"
defaultValue="300"/>
<applicationConfigurable groupId="tools" instance="com.jetbrains.edu.learning.settings.EduConfigurable"
id="Educational"
key="settings.education" bundle="messages.EduCoreBundle"/>
<registryKey key="edu.marketplace.solutions.sharing.prompt.default.delay"
description="Delay of prompting second banner (in millis). Default value is equal to 14 days."
defaultValue="1209600000"/>
<registryKey key="edu.marketplace.PostMarketplaceProjectToGitHub.completion.condition"
description="Course completion percentage, which should prompt the student to publish the project on GitHub"
defaultValue="80"/>
<registryKey key="edu.learning.objects.storage.type"
description="Controls the way the original author data is stored in the project. This setting does not affect existing course projects, it affects only newly created projects"
defaultValue="[SQLite*|YAML]"/>
<toolWindow id="Task" anchor="right" order="first"
factoryClass="com.jetbrains.edu.learning.taskToolWindow.ui.TaskToolWindowFactory"
icon="com.jetbrains.edu.EducationalCoreIcons.TaskToolWindow.CourseToolWindow"/>
<toolWindow id="Educational.CheckDetails" anchor="bottom" canCloseContents="true" doNotActivateOnStart="true"
factoryClass="com.jetbrains.edu.learning.checker.details.CheckDetailsToolWindowFactory"
icon="com.jetbrains.edu.EducationalCoreIcons.CheckPanel.CheckDetailsToolWindow"/>
<!-- placeholders -->
<editorFactoryListener implementation="com.jetbrains.edu.learning.editor.EduEditorFactoryListener"/>
<highlightingPassFactory implementation="com.jetbrains.edu.learning.placeholder.PlaceholderHighlightingPassFactory"/>
<additionalTextAttributes scheme="Default" file="colorScheme/EduDefault.xml"/>
<additionalTextAttributes scheme="Darcula" file="colorScheme/EduDarcula.xml"/>
<registryKey key="edu.placeholder.highlighting.pass" defaultValue="false" restartRequired="true"
description="Render answer placeholders in JetBrains Academy courses using highlighting API"/>
<!-- should be last, otherwise project tree will be changed with GradleTreeStructureProvider -->
<highlightErrorFilter implementation="com.jetbrains.edu.learning.editor.EduHighlightErrorFilter"/>
<!-- Rename -->
<renamePsiElementProcessor implementation="com.jetbrains.edu.learning.handlers.rename.SectionRenameProcessor" order="first"/>
<renamePsiElementProcessor implementation="com.jetbrains.edu.learning.handlers.rename.LessonRenameProcessor" order="first"/>
<renamePsiElementProcessor implementation="com.jetbrains.edu.learning.handlers.rename.TaskRenameProcessor" order="first"/>
<renamePsiElementProcessor implementation="com.jetbrains.edu.learning.handlers.rename.EduTaskFileRenameProcessor" order="first"/>
<!-- Move -->
<refactoring.moveHandler implementation="com.jetbrains.edu.learning.handlers.EduMoveDelegate" order="first"/>
<!-- Notifications -->
<editorNotificationProvider
implementation="com.jetbrains.edu.learning.placeholderDependencies.UnsolvedDependenciesNotificationProvider"/>
<editorNotificationProvider implementation="com.jetbrains.edu.learning.stepik.UpdateCourseNotificationProvider"/>
<editorNotificationProvider implementation="com.jetbrains.edu.learning.editor.EduTaskFileNotificationProvider"/>
<editorNotificationProvider implementation="com.jetbrains.edu.learning.yaml.YamlConfigNotificationProvider"/>
<editorNotificationProvider implementation="com.jetbrains.edu.coursecreator.framework.editor.SyncChangesEditorNotificationsProvider"/>
<editorNotificationProvider implementation="com.jetbrains.edu.learning.agreement.UserAgreementEditorNotificationsProvider"/>
<editorNotificationProvider implementation="com.jetbrains.edu.learning.stepik.hyperskill.InstallHyperskillPluginEditorNotificationsProvider"/>
<!-- com.jetbrains.edu.learning.notification.EduNotificationManager.JETBRAINS_ACADEMY_GROUP_ID -->
<notificationGroup id="JetBrains Academy" displayType="BALLOON"
bundle="messages.EduCoreBundle" key="notification.group.edu.tools"/>
<!--suppress PluginXmlValidity -->
<statistics.applicationUsagesCollector implementation="com.jetbrains.edu.learning.statistics.EduStateUsagesCollector"/>
<statistics.counterUsagesCollector implementationClass="com.jetbrains.edu.learning.statistics.EduCounterUsageCollector"/>
<applicationService serviceImplementation="com.jetbrains.edu.learning.EduSettings"/>
<applicationService serviceImplementation="com.jetbrains.edu.learning.coursera.CourseraSettings"/>
<httpRequestHandler implementation="com.jetbrains.edu.learning.stepik.builtInServer.StepikRestService"/>
<httpRequestHandler implementation="com.jetbrains.edu.learning.taskToolWindow.ui.EduToolsResourcesRequestHandler"/>
<registryKey key="edu.course.update.check.interval"
description="Sets is course up to date check interval in seconds"
defaultValue="18000"/>
<!--for educators-->
<xml.xmlSuppressionProvider
implementation="com.jetbrains.edu.coursecreator.taskDescription.ShortcutInTaskDescriptionSuppressionProvider"/>
<fileEditorProvider implementation="com.jetbrains.edu.coursecreator.framework.editor.EduSplitFileEditorProvider" order="first"/>
<!-- Rename -->
<renamePsiElementProcessor implementation="com.jetbrains.edu.coursecreator.handlers.rename.CCDescriptionFileRenameProcessor" order="first"/>
<!-- Move -->
<refactoring.moveHandler implementation="com.jetbrains.edu.coursecreator.handlers.move.CCSectionMoveHandlerDelegate"
order="first"/>
<refactoring.moveHandler implementation="com.jetbrains.edu.coursecreator.handlers.move.CCLessonMoveHandlerDelegate"
order="first"/>
<refactoring.moveHandler implementation="com.jetbrains.edu.coursecreator.handlers.move.CCTaskMoveHandlerDelegate"
order="first"/>
<highlightErrorFilter implementation="com.jetbrains.edu.coursecreator.CCHighlightErrorFilter"/>
<projectViewPane implementation="com.jetbrains.edu.learning.projectView.CourseViewPane"/>
<editorActionHandler action="EditorBackSpace" implementationClass="com.jetbrains.edu.learning.editor.EduTypedHandler"
order="first"/>
<editorActionHandler action="EditorDelete" implementationClass="com.jetbrains.edu.learning.editor.EduTypedHandler"
order="first"/>
<editorActionHandler action="EditorCut" implementationClass="com.jetbrains.edu.learning.editor.EduCutTypedHandler"
order="first"/>
<editorActionHandler action="EditorCutLineEnd" implementationClass="com.jetbrains.edu.learning.editor.EduTypedLineHandler"/>
<editorActionHandler action="EditorCutLineBackward" implementationClass="com.jetbrains.edu.learning.editor.EduTypedLineHandler"/>
<editorActionHandler action="EditorDeleteToLineEnd" implementationClass="com.jetbrains.edu.learning.editor.EduTypedLineHandler"/>
<editorActionHandler action="EditorDeleteToLineStart" implementationClass="com.jetbrains.edu.learning.editor.EduTypedLineHandler"/>
<editorActionHandler action="EditorDeleteLine" implementationClass="com.jetbrains.edu.learning.editor.EduTypedLineHandler"/>
<experimentalFeature id="edu.course.creator.split.editor" percentOfUsers="100" internalFeature="true">
<description>Enables previous task view for guided projects</description>
</experimentalFeature>
<liveTemplateContext implementation="com.jetbrains.edu.coursecreator.taskDescription.HintTemplateContextType"/>
<defaultLiveTemplates file="liveTemplates/hint.xml"/>
<editorNotificationProvider implementation="com.jetbrains.edu.learning.yaml.GeneratedRemoteInfoNotificationProvider"/>
<registryKey key="edu.course.creator.solve.all"
description="Enables `Solve All Tasks Before` action"
defaultValue="false"/>
<writingAccessProvider implementation="com.jetbrains.edu.learning.editor.EditableFileProvider"/>
<trailingSpacesOptionsProvider implementation="com.jetbrains.edu.learning.editor.TrailingSpacesOptionsAnswerTaskProvider"/>
<experimentalFeature id="edu.course.sql" percentOfUsers="100" internalFeature="true">
<description>Enables support for SQL courses</description>
</experimentalFeature>
<experimentalFeature id="edu.course.update.new" percentOfUsers="100">
<description>Enable the new course update functionality to provide more efficient course updates</description>
</experimentalFeature>
<experimentalFeature id="edu.educator.help" percentOfUsers="100">
<description>Open educator help for newly created CC courses; add Help button to the toolbar above course view</description>
</experimentalFeature>
<registryKey key="edu.course.creator.fl.sync.changes.merging.timespan"
description="The delay in ms before task file synchronization in the guided project for Course Creator.\nChanging the field requires reopening the project"
defaultValue="1000"/>
<iconMapper mappingFile="EduToolsIconMappings.json"/>
<themeMetadataProvider path="JetBrainsAcademyPlugin.themeMetadata.json"/>
<coursesStorageProvider implementation="com.jetbrains.edu.learning.newproject.coursesStorage.JetBrainsAcademyCoursesStorageProvider"/>
<registryKey key="edu.network.request.assertion.policy"
description="Assertion policy for network requests from EDT in JetBrains Academy plugin"
defaultValue="[OFF|LOG_ERROR*|EXCEPTION]"/>
</extensions>
<extensions defaultExtensionNs="Educational">
<!-- Only for development purposes -->
<configurator language="TEXT" implementationClass="com.jetbrains.edu.learning.configuration.PlainTextConfigurator"/>
<optionsProvider instance="com.jetbrains.edu.learning.stepik.StepikOptions"/>
<optionsProvider instance="com.jetbrains.edu.learning.coursera.CourseraOptions"/>
<checkListener implementation="com.jetbrains.edu.learning.statistics.PostFeedbackCheckListener"/>
<checkListener implementation="com.jetbrains.edu.coursecreator.validation.ValidationCheckListener"/>
<coursesPlatformProviderFactory id="Marketplace" order="first"
implementation="com.jetbrains.edu.learning.marketplace.newProjectUI.MarketplacePlatformProviderFactory"/>
<coursesPlatformProviderFactory id="Hyperskill" order="after Marketplace"
implementation="com.jetbrains.edu.learning.stepik.hyperskill.newProjectUI.HyperskillInstallPluginPlatformProviderFactory"/>
<coursesPlatformProviderFactory id="Coursera" order="after Hyperskill"
implementation="com.jetbrains.edu.learning.coursera.CourseraPlatformProviderFactory"/>
<remoteTaskChecker implementation="com.jetbrains.edu.learning.coursera.CourseraTaskChecker"/>
<!-- Course compatibility providers -->
<compatibilityProvider language="JAVA"
implementationClass="com.jetbrains.edu.learning.compatibility.JCourseCompatibilityProvider"/>
<compatibilityProvider language="kotlin"
implementationClass="com.jetbrains.edu.learning.compatibility.KtCourseCompatibilityProvider"/>
<compatibilityProvider language="Scala"
environment="Gradle"
implementationClass="com.jetbrains.edu.learning.compatibility.ScalaGradleCourseCompatibilityProvider"/>
<compatibilityProvider language="Scala"
environment="sbt"
implementationClass="com.jetbrains.edu.learning.compatibility.ScalaSbtCourseCompatibilityProvider"/>
<compatibilityProvider language="kotlin"
environment="Android"
implementationClass="com.jetbrains.edu.learning.compatibility.AndroidCourseCompatibilityProvider"/>
<compatibilityProvider language="Python"
implementationClass="com.jetbrains.edu.learning.compatibility.PyCourseCompatibilityProvider"/>
<compatibilityProvider language="Python"
environment="unittest"
implementationClass="com.jetbrains.edu.learning.compatibility.PyCourseCompatibilityProvider"/>
<compatibilityProvider language="JavaScript"
implementationClass="com.jetbrains.edu.learning.compatibility.JsCourseCompatibilityProvider"/>
<compatibilityProvider language="Rust"
implementationClass="com.jetbrains.edu.learning.compatibility.RsCourseCompatibilityProvider"/>
<compatibilityProvider language="go"
implementationClass="com.jetbrains.edu.learning.compatibility.GoCourseCompatibilityProvider"/>
<compatibilityProvider language="PHP"
implementationClass="com.jetbrains.edu.learning.compatibility.PhpCourseCompatibilityProvider"/>
<compatibilityProvider language="SQL"
implementationClass="com.jetbrains.edu.learning.compatibility.SqlGradleCourseCompatibilityProvider"/>
<compatibilityProvider language="Shell Script"
implementationClass="com.jetbrains.edu.learning.compatibility.ShellCourseCompatibilityProvider"/>
<!--educator-->
<optionsProvider instance="com.jetbrains.edu.coursecreator.settings.CCOptions"/>
<pathMacroProvider implementation="com.jetbrains.edu.learning.checker.TaskRunConfigurationPathMacroProvider"/>
<courseMetadataProcessor implementation="com.jetbrains.edu.learning.marketplace.lti.LtiCourseMetadataProcessor"/>
<courseMetadataProcessor implementation="com.jetbrains.edu.learning.statistics.metadata.CoursePageExperimentMetadataProcessor"/>
<courseMetadataProcessor implementation="com.jetbrains.edu.learning.statistics.metadata.EntryPointMetadataProcessor"/>
<courseMetadataProcessor implementation="com.jetbrains.edu.learning.marketplace.metadata.OpenOnSiteLinkMetadataProcessor"/>
</extensions>
<xi:include href="/META-INF/Marketplace.xml" xpointer="xpointer(/idea-plugin/*)"/>
<xi:include href="/META-INF/LTI.xml" xpointer="xpointer(/idea-plugin/*)"/>
<xi:include href="/META-INF/course-storage.xml" xpointer="xpointer(/idea-plugin/*)"/>
<extensions defaultExtensionNs="Educational">
<optionsProvider instance="com.jetbrains.edu.learning.agreement.UserAgreementOptions"/>
</extensions>
</idea-plugin>