コード例 #1
0
        public void BuildDtbTest()
        {
            var builder = new DtbBuilder(MergeEntry.LoadMergeEntriesFromNcc(Dtb1NccUri));

            builder.BuildDtb();
            ValidateBuiltDtb(builder);
        }
コード例 #2
0
        public void SaveDtbTest()
        {
            var builder = new DtbBuilder(MergeEntry.LoadMergeEntriesFromNcc(Dtb1NccUri));

            builder.BuildDtb();
            builder.SaveDtb("./MergedDTB");
            ValidateSavedDtb(builder, "./MergedDTB");
        }
コード例 #3
0
        [Ignore]//Need to map C:\Users\oha\VirtualBlizzardDrive to D: using subst D: C:\Users\oha\VirtualBlizzardDrive
        public void SaveBerlDtbTest()
        {
            var builder = new DtbBuilder(MergeEntry.LoadMergeEntriesFromMacro(new Uri(
                                                                                  @"D:\BlizzardData\batch\BERL\Publisher\20180516_143247_001\merge.xml")));

            builder.BuildDtb();
            builder.SaveDtb("./MergedBERLDTB");
            ValidateSavedDtb(builder, "./MergedBERLDTB");
        }
コード例 #4
0
        private void ValidateSavedDtb(DtbBuilder builder, string destDir)
        {
            ValidateBuiltDtb(builder);
            foreach (var xmlFileName in builder.XmlDocuments.Keys)
            {
                Assert.IsTrue(File.Exists(Path.Combine(destDir, xmlFileName)));
            }

            if (builder.ContentDocument != null)
            {
                foreach (var imgSrcAttr in builder.ContentDocument.Descendants(Utils.XhtmlNs + "img")
                         .Select(img => img.Attribute("src"))
                         .Where(a => a != null))
                {
                    Assert.IsTrue(File.Exists(Path.Combine(destDir, imgSrcAttr.Value)), $"Image for {imgSrcAttr.Parent} not found");
                }
            }
        }
コード例 #5
0
        private static int Main(string[] args)
        {
            if (args.Length != 2)
            {
                Console.WriteLine($"Invalid number of arguments\n{Usage}");
                return(-1);
            }

            try
            {
                if (!File.Exists(args[0]))
                {
                    Console.WriteLine($"Could not find macro file {args[0]}\n{Usage}");
                }

                XDocument macro;
                try
                {
                    macro = XDocument.Load(args[0], LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);
                }
                catch (XmlException xe)
                {
                    Console.WriteLine(
                        $"Could not load macro {args[0]}: {xe.Message}\nat line {xe.LineNumber}, pos {xe.LinePosition})");
                    return(-1);
                }
                Console.WriteLine($"Loaded macro {args[0]}");
                DtbBuilder builder;
                try
                {
                    builder = new DtbBuilder(MergeEntry.LoadMergeEntriesFromMacro(macro));
                }
                catch (Exception e)
                {
                    Console.WriteLine(
                        $"Could not load merge entries from macro {args[0]}: {e.Message}\n{Usage}");
                    return(-1);
                }
                builder.BuildDtb();
                Console.WriteLine("Built Dtb");
                if (!Directory.Exists(args[1]))
                {
                    try
                    {
                        Directory.CreateDirectory(args[1]);
                        Console.WriteLine($"Created output directory {args[1]}");
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine($"Could not create directory {args[1]}: {e.Message}\n{Usage}");
                        return(-1);
                    }
                }

                builder.SaveDtb(
                    args[1],
                    (i, s) =>
                {
                    Console.Write($"{i} % {s}".PadRight(100).Substring(0, 100) + "\r");
                    return(false);
                });
                Console.Write("".PadRight(101) + "\r");
                Console.WriteLine($"Saved built Dtb to {args[1]}");
                return(0);
            }
            catch (Exception e)
            {
                Console.WriteLine($"An unexpected {e.GetType()} occured: {e.Message}\n{Usage}");
                return(-2);
            }
        }
コード例 #6
0
        private void ValidateBuiltDtb(DtbBuilder builder)
        {
            var entries = builder.MergeEntries.SelectMany(me => me.DescententsAndSelf).ToList();

            Assert.AreEqual(entries.Count, builder.SmilFiles.Count, "Expected one smil file per merge file entry");
            Assert.AreEqual(entries.Count, builder.AudioSegmentsByAudioFileDictionary.Count, "Expected one audio file per merge file entry");
            Assert.IsFalse(builder.NccDocument.Root?.Elements(Utils.XhtmlNs + "body").Elements(Utils.XhtmlNs + "p").Any() ?? false, "Found <p> elements in ncc");
            var nccHeadings = builder.NccDocument.Root?.Element(Utils.XhtmlNs + "body")?.Elements()
                              .Where(Utils.IsHeading).ToList() ?? new List <XElement>();

            Assert.AreEqual(entries.Count, nccHeadings?.Count ?? 0, "Expected one heading in built ncc per merge entry");
            for (int i = 0; i < entries.Count; i++)
            {
                Assert.AreEqual(
                    Utils.XhtmlNs + $"h{Math.Min(entries[i].Depth, 6)}",
                    nccHeadings[i].Name,
                    $"Expected heading {nccHeadings[i]} at index {i} to be a {Utils.XhtmlNs+$"h{ entries[i].Depth}"} heading");
            }

            foreach (var smilFile in builder.SmilFiles.Values)
            {
                var dcFormat = smilFile
                               .Descendants("meta")
                               .Where(meta => meta.Attribute("name")?.Value == "dc:format")
                               .Select(meta => meta.Attribute("content")?.Value)
                               .FirstOrDefault();
                Assert.AreEqual("Daisy 2.02", dcFormat, $"Expected dc:format to be 'Daisy 2.02");
            }

            foreach (var audio in builder.SmilFiles.Values
                     .SelectMany(doc => doc.Descendants("audio"))
                     .Where(audio => audio.Attribute("src") != null))
            {
                Assert.IsTrue(builder.AudioSegmentsByAudioFileDictionary.Keys.Contains(audio.Attribute("src")?.Value), $"Found no audio segment matching {audio} in {audio.BaseUri}");
            }
            Assert.IsNotNull(builder.NccDocument.Root, "Ncc has no root element");
            var nccElements = (
                builder.NccDocument.Root
                .Element(Utils.XhtmlNs + "body")
                ?.Elements()
                ?? new XElement[0]).ToList();
            var textElements =
                builder
                .XmlDocuments
                .Values
                .SelectMany(d =>
                            d.Root?.Element(Utils.XhtmlNs + "body")?.Elements() ?? new XElement[0])
                .ToList();

            Assert.IsTrue(nccElements.Any(), "Ncc document has no body elements");
            foreach (var element in nccElements.Concat(textElements))
            {
                var elemIdentifier = $"{element.BaseUri.Split('/').LastOrDefault()??""}#{element.Attribute("id")?.Value}";
                Assert.AreEqual(Utils.XhtmlNs, element.Name.Namespace, $"Ncc element has invalid namespace {element.Name}");
                var aHref = element.DescendantsAndSelf(Utils.XhtmlNs + "a").SingleOrDefault()?.Attribute("href");
                if (aHref == null)
                {
                    Assert.IsFalse(
                        nccElements.Contains(element),
                        $"Ncc element {elemIdentifier} has no child a element");
                    continue;
                }
                var smilUri  = Utils.GetUri(aHref);
                var fileName = smilUri.AbsolutePath.Split('/').LastOrDefault();
                Assert.IsNotNull(fileName, $"Ncc/text a element {elemIdentifier} does not point to file");
                Assert.IsTrue(
                    builder.SmilFiles.ContainsKey(fileName),
                    $"Ncc/text a element {elemIdentifier} points to invalid smil file {fileName}");
                Assert.IsTrue(
                    builder.SmilFiles[fileName].Descendants("par").Any(par => $"#{par.Attribute("id")?.Value}" == smilUri.Fragment),
                    $"Par element {aHref.Value} pointed to by Ncc/text element {elemIdentifier} not found");
            }
        }