private static MDSlide ParseSlidePart(IList <SlidePart> slideParts, int slideIndex) { var slidePart = slideParts[slideIndex]; if (slidePart == null) { throw new ArgumentNullException("slidePart"); } if (slidePart.Slide == null) { throw new ArgumentNullException("slidePart.Slide"); } SlideType slideType = GetSlideType(slidePart, slideIndex); MDSlide slide = AssignSlide(slideType); // Extract texts var shapes = slidePart.Slide.Descendants <Shape>().Where(s => s.Descendants <Drawing.Paragraph>().Any()); foreach (Shape shape in shapes) { if (string.IsNullOrWhiteSpace(shape.InnerText)) { continue; } slide.AddShapes(GetShapes(shape)); } // Extract images var pictures = slidePart.Slide.Descendants <Picture>().ToList(); foreach (var picture in pictures) { string rId = picture.BlipFill.Blip.Embed.Value; ImagePart imagePart = (ImagePart)slidePart.Slide.SlidePart.GetPartById(rId); Image image = Image.FromStream(imagePart.GetStream()); SaveImageToFile(image, slideIndex); MDShapeImage mdImage = GetImage(slideIndex, image, picture); presentationImageIndex++; slide.AddShape(mdImage); } // Extract graphics var graphics = slidePart.Slide.Descendants <GraphicFrame>().ToList(); foreach (var graphic in graphics) { // TODO: Find a way to export graphics as images } return(slide); }
// open at your own risk public static void ExtractWebPageToMD(string baseUrl, string[] pages, string githubName, string language, string destinationDir) { gitHub = githubName; lang = language; for (int i = 0; i < pages.Length; i++) { #region get and convert slide info string page = pages[i]; string url = baseUrl + page + ".html"; string html = GetHTML(url).Result; HtmlDocument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(html); var doc = htmlDoc.DocumentNode; MDPresentation mdPresentation = new MDPresentation(); var headings = doc.SelectNodes("//h1"); IMDShape shape = null; int slideLength = 0; for (int j = 0; j < headings.Count; j++) { var heading = headings[j]; mdPresentation.StartNewSection(true); IMDSlide slide; if (mdPresentation.Sections.Count == 1 && mdPresentation.Sections.First().Slides.Count == 0) { slide = new MDSlidePresentationTitle(); slide.AddShape(new MDShapeTitle(heading.InnerText)); slide.AddShape(new MDShapeText("TypeScript OOP", 0)); slide.AddShape(new MDShapeText("Telerik Software Academy", 0)); slide.AddShape(new MDShapeText("http://academy.telerik.com", 0)); mdPresentation.AddSlide(slide); slide = new MDSlide(); slide.AddShape(new MDShapeTitle("Table of Contents")); for (int k = 1; k < headings.Count; k++) { if (k != 0 && k % 10 == 0) { mdPresentation.AddSlide(slide); slide = new MDSlide(); slide.AddShape(new MDShapeTitle("Table of Contents")); } slide.AddShape(new MDShapeText(string.Format("[{0}](#{1})", headings[k].InnerText, headings[k].InnerText.ToLower().Replace(' ', '-')), 0)); } mdPresentation.AddSlide(slide); } else if (mdPresentation.Sections.Count > 1 && mdPresentation.Sections.Last().Slides.Count == 0) { slide = new MDSlideSection(); slide.AddShape(new MDShapeTitle(heading.InnerText)); slide.CssId = headings[j].InnerText.ToLower().Replace(' ', '-'); mdPresentation.AddSlide(slide); slide = new MDSlide(); } else { slide = new MDSlide(); slide.AddShape(new MDShapeTitle(heading.InnerText)); } slide = new MDSlide(); slide.AddShape(new MDShapeTitle(heading.InnerText)); slideLength = 0; var tag = heading; while (tag.NextSibling != null && tag.NextSibling.Name != "h1") { // start new slide if current is too long if (slideLength > 350) { mdPresentation.AddSlide(slide); slide = new MDSlide(); slide.AddShape(new MDShapeTitle(heading.InnerText, false, true)); slideLength = 0; } tag = tag.NextSibling; if (tag.Name == "p") { shape = new MDShapeText(tag.InnerText, 0); } else if (tag.Name == "pre") { shape = new MDShapeMultiCode(lang); shape.AddLine(tag.InnerText, 0); } slideLength += tag.InnerText.Length; slide.AddShape(shape); } mdPresentation.AddSlide(slide); } mdPresentation.StartNewSection(true); mdPresentation.AddSlide(new MDSlideQuestions(headings[0].InnerText)); #endregion #region create sub-directorues DirectoryInfo mdsDir = Directory.CreateDirectory(destinationDir); string lectureSubDir = page.ToLower().Replace(' ', '-'); DirectoryInfo lectureDir = mdsDir.CreateSubdirectory(string.Format("{0:d2}. {1}", i + 1, lectureSubDir)); DirectoryInfo slidesDir = lectureDir; var demosDir = lectureDir.GetDirectories().FirstOrDefault(x => x.Name.Equals("demos", StringComparison.CurrentCultureIgnoreCase)); var homeworkDir = lectureDir.GetDirectories().FirstOrDefault(x => x.Name.Equals("homework", StringComparison.CurrentCultureIgnoreCase)); if (demosDir == null) { demosDir = lectureDir.CreateSubdirectory("demos"); } if (homeworkDir == null) { homeworkDir = lectureDir.CreateSubdirectory("homework"); } #endregion #region add all files //AddTableOfContentsREADME(lectureDir); AddLocalServerFiles(slidesDir); File.WriteAllLines(slidesDir + @"\README.md", mdPresentation.ToStringArray()); Console.WriteLine("Added files for presentation:\n{0}\n", page); #endregion } }