private static IEnumerable <Unit> LoadUnits(DirectoryInfo dir, CourseSettings settings, string courseId) { var unitsDirectories = dir.GetDirectories().OrderBy(d => d.Name); var unitIds = new HashSet <Guid>(); var unitUrls = new HashSet <string>(); var slideIndex = 0; foreach (var unitDirectory in unitsDirectories) { var unit = UnitLoader.LoadUnit(unitDirectory, settings, courseId, slideIndex); if (unitIds.Contains(unit.Id)) { throw new CourseLoadingException($"Ошибка в курсе \"{settings.Title}\" при загрузке модуля \"{unit.Title}\" из {unitDirectory.FullName}. " + $"Повторяющийся идентификатор модуля: {unit.Id}. Идентификаторы модулей должны быть уникальными. " + $"К этому времени загружены модули {string.Join(", ", unitIds)}"); } unitIds.Add(unit.Id); if (unitUrls.Contains(unit.Url)) { throw new CourseLoadingException($"Ошибка в курсе \"{settings.Title}\" при загрузке модуля \"{unit.Title}\" из {unitDirectory.FullName}. Повторяющийся url-адрес модуля: {unit.Url}. Url-адреса модулей должны быть уникальными"); } unitUrls.Add(unit.Url); yield return(unit); slideIndex += unit.Slides.Count; } }
private static void CreateCourseFromExample(string courseId, string path, FileInfo helpPackage) { helpPackage.CopyTo(path, true); var nsResolver = new XmlNamespaceManager(new NameTable()); nsResolver.AddNamespace("course", "https://ulearn.azurewebsites.net/course"); nsResolver.AddNamespace("lesson", "https://ulearn.azurewebsites.net/lesson"); nsResolver.AddNamespace("quiz", "https://ulearn.azurewebsites.net/quiz"); using (var zip = ZipFile.Read(path, new ReadOptions { Encoding = Encoding.GetEncoding(866) })) { if (zip.ContainsEntry("Course.xml")) { UpdateXmlElement(zip["Course.xml"], "//course:Course/course:title", courseId, zip, nsResolver); } foreach (var entry in zip.SelectEntries("name = *.lesson.xml").Where(entry => UnitLoader.IsSlideFile(Path.GetFileName(entry.FileName)))) { UpdateXmlElement(entry, "//lesson:Lesson/lesson:id", Guid.NewGuid().ToString(), zip, nsResolver); } foreach (var entry in zip.SelectEntries("name = *.quiz.xml").Where(entry => UnitLoader.IsSlideFile(Path.GetFileName(entry.FileName)))) { UpdateXmlAttribute(entry, "//quiz:Quiz", "id", Guid.NewGuid().ToString(), zip, nsResolver); } foreach (var entry in zip.SelectEntries("name = *.cs").Where(entry => UnitLoader.IsSlideFile(Path.GetFileName(entry.FileName)))) { UpdateCsFiles(entry, Guid.NewGuid().ToString(), zip); } } }