public string RenderSlide(Course course, Slide slide) { var jsFiles = GetJsFiles().Select(f => Path.GetFullPath(".\\html\\" + f)); var cssFiles = GetCssFiles().Select(f => Path.GetFullPath(".\\html\\" + f)); var page = StandaloneLayout.Page(course, slide, CreateToc(course, slide), cssFiles, jsFiles); return "<!DOCTYPE html>\n" + page.ToHtmlString(); }
public CourseDiff(Course original, Course changed) { OriginalCourse = original; ChangedCourse = changed; RemovedSlides = new List<Slide>(); InsertedSlides = new List<Slide>(); SlideDiffs = new List<SlideDiff>(); FindDifferences(); }
public static string[] SpellCheckCourse(this SpellChecker spellchecker, Course course) { var titleErrors = spellchecker.SpellCheckString(course.Title).Select(e => e.ToPrettyString()).ToList(); var titleError = ToPrettyMessage("Заголовок курса:", titleErrors); var unitsErrors = course.GetUnits().SelectMany(spellchecker.SpellCheckString).Select(e => e.ToPrettyString()).ToList(); var unitsError = ToPrettyMessage("Заголовки модулей:", unitsErrors); var slidesErrors = course.Slides.Select(spellchecker.SpellCheckSlide).Where(s => !string.IsNullOrWhiteSpace(s)); var res = new List<string> { titleError, unitsError }; res.AddRange(slidesErrors); return res.Where(s => !string.IsNullOrWhiteSpace(s)).ToArray(); }
private static Sequential[] CourseToSequentials(Course course, string exerciseUrl, string solutionsUrl, Dictionary<string, string> videoGuids, string ltiId) { var units = course.GetUnits().ToList(); return Enumerable .Range(0, units.Count) .Select( x => new Sequential(course.Id + "-1-" + x, units[x], course.Slides .Where(y => y.Info.UnitName == units[x]) .SelectMany(y => y.ToVerticals(course.Id, exerciseUrl, solutionsUrl, videoGuids, ltiId)) .ToArray() ) ).ToArray(); }
public void LoadFrom(DirectoryInfo dir) { Course = new CourseLoader().LoadCourse(dir); CourseDirectory = dir; NotifyChanged(); }
public static System.Web.WebPages.HelperResult Page(Course course, Slide slide, TocModel toc, IEnumerable<string> cssFiles, IEnumerable<string> jsFiles) { return new System.Web.WebPages.HelperResult(__razor_helper_writer => { WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t<html>\r\n\t<head>\r\n\t\t<title>Preview: "); WebViewPage.WriteTo(@__razor_helper_writer, course.Title); WebViewPage.WriteLiteralTo(@__razor_helper_writer, " — "); WebViewPage.WriteTo(@__razor_helper_writer, slide.Title); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "</title>\r\n\t\t<link rel=\"shortcut icon\" href=\"favicon.ico?v=1\" />\r\n\t\t<meta charset=" + "\'UTF-8\'>\r\n"); foreach (var cssFile in cssFiles) { WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t\t\t<link href=\'"); WebViewPage.WriteTo(@__razor_helper_writer, cssFile); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\' rel=\'stylesheet\' />\r\n"); } WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t</head>\r\n\t<body>\r\n\t\t<div class=\'side-bar navbar-collapse collapse navbar-nav con" + "tainer\'>\r\n\t\t\t"); WebViewPage.WriteTo(@__razor_helper_writer, TableOfContents.Toc(toc)); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\r\n\t\t</div>\r\n\r\n\t\t<div class=\"slide-container\">\r\n\t\t\t<div class=\"container body-cont" + "ent\">\r\n\t\t\t\t<div class=\"row\">\r\n\t\t\t\t\t"); WebViewPage.WriteTo(@__razor_helper_writer, SlideHtml.Slide(new BlockRenderContext(course, slide, "/static/", slide.Blocks.Select( (b, i) => b is ExerciseBlock ? new ExerciseBlockData { RunSolutionUrl = "/" + slide.Index.ToString("000") + ".html?query=submit", DebugView = true } : b is AbstractQuestionBlock ? new QuizInfoModel(new QuizModel() {AnswersToQuizes = slide.Blocks.OfType<AbstractQuestionBlock>().ToDictionary(x => x.Id, x => new List<string>())}, b, i, QuizState.Total) : (dynamic)null ).ToArray() ) )); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\r\n"); foreach (var jsFile in jsFiles) { WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t\t\t<script src=\'"); WebViewPage.WriteTo(@__razor_helper_writer, jsFile); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\'></script>\r\n"); } WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t</body>\r\n</html>\r\n"); }); }
private static string TryGetDictionaryPath(this Course course) { var file = Path.Combine(course.Directory.FullName, course.Settings.GetDictionaryFile()); return(File.Exists(file) ? file : null); }
public static System.Web.WebPages.HelperResult Page(Course course, Slide slide, TocModel toc, IEnumerable<string> cssFiles, IEnumerable<string> jsFiles) { return new System.Web.WebPages.HelperResult(__razor_helper_writer => { WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t<html>\r\n\t<head>\r\n\t\t<title>Preview: "); WebViewPage.WriteTo(@__razor_helper_writer, course.Title); WebViewPage.WriteLiteralTo(@__razor_helper_writer, " — "); WebViewPage.WriteTo(@__razor_helper_writer, slide.Title); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "</title>\r\n\t\t<meta charset=\'UTF-8\'>\r\n"); foreach (var cssFile in cssFiles) { WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t\t\t<link href=\'"); WebViewPage.WriteTo(@__razor_helper_writer, cssFile); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\' rel=\'stylesheet\' />\r\n"); } WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t</head>\r\n\t<body>\r\n\t\t<div class=\'side-bar navbar-collapse collapse navbar-nav con" + "tainer\'>\r\n\t\t\t"); WebViewPage.WriteTo(@__razor_helper_writer, TableOfContents.Toc(toc)); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\r\n\t\t</div>\r\n\r\n\t\t<div class=\"slide-container\">\r\n\t\t\t<div class=\"container body-cont" + "ent\">\r\n\t\t\t\t<div class=\"row\">\r\n\t\t\t\t\t"); WebViewPage.WriteTo(@__razor_helper_writer, SlideHtml.Slide(new BlockRenderContext(course, slide, slide.Info.SlideFile.Directory.FullName, slide.Blocks.Select(b => (dynamic)null).ToArray()))); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\r\n\r\n"); foreach (var jsFile in jsFiles) { WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t\t\t<script src=\'"); WebViewPage.WriteTo(@__razor_helper_writer, jsFile); WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\'></script>\r\n"); } WebViewPage.WriteLiteralTo(@__razor_helper_writer, "\t</body>\r\n</html>\r\n"); }); }
public static EdxCourse ToEdxCourse(Course course, string organization, string exerciseUrl, string solutionsUrl, Dictionary<string, string> youtubeId2UlearnVideoIds, string ltiId) { return new EdxCourse(course.Id, organization, course.Title, null, null, new [] { new Chapter(course.Id + "-1", course.Title, CourseToSequentials(course, exerciseUrl, solutionsUrl, youtubeId2UlearnVideoIds, ltiId)) }); }
private TocModel CreateToc(Course course, Slide slide) { var builder = new TocModelBuilder(s => GetSlideUrl(s), s => 0, course, slide.Index); return builder.CreateTocModel(); }
public void SetUp() { var cm = new CourseManager(new DirectoryInfo(@"..\..\..\uLearn.Web")); cm.ReloadCourse("ForTests.zip"); course = cm.GetCourses().Single(); }
private void FixFileReferencesInCourse(Course course, DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory) { foreach (var instructorNote in course.InstructorNotes) instructorNote.File = (FileInfo)GetNewPathForFileAfterMoving(instructorNote.File, sourceDirectory, destinationDirectory); foreach (var slide in course.Slides) { slide.Info.SlideFile = (FileInfo)GetNewPathForFileAfterMoving(slide.Info.SlideFile, sourceDirectory, destinationDirectory); foreach (var exerciseBlock in slide.Blocks.OfType<ProjectExerciseBlock>()) exerciseBlock.SlideFolderPath = (DirectoryInfo)GetNewPathForFileAfterMoving(exerciseBlock.SlideFolderPath, sourceDirectory, destinationDirectory); } }
public void MoveCourse(Course course, DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory) { var tempDirectoryName = coursesDirectory.GetSubdir(Path.GetRandomFileName()); LockCourse(course.Id); try { TrySeveralTimes(() => Directory.Move(destinationDirectory.FullName, tempDirectoryName.FullName)); try { TrySeveralTimes(() => Directory.Move(sourceDirectory.FullName, destinationDirectory.FullName)); } catch (IOException) { /* In case of any file system's error rollback previous operation */ TrySeveralTimes(() => Directory.Move(tempDirectoryName.FullName, destinationDirectory.FullName)); throw; } FixFileReferencesInCourse(course, sourceDirectory, destinationDirectory); UpdateCourse(course); } finally { ReleaseCourse(course.Id); } TrySeveralTimes(() => ClearDirectory(tempDirectoryName, true)); }
public void UpdateCourse(Course course) { if (!courses.ContainsKey(course.Id)) return; courses[course.Id] = course; }