예제 #1
0
        protected virtual void TranslateDevHtmlDocument(string sourceFilePath, string targetFilePath)
        {
            HtmlDocument htmlDoc = new HtmlDocument();

            VisitedItems.Clear();
            try
            {
                using (var srcTxtReader = CreateStreamReaderFromFile(sourceFilePath))
                    using (var tarTxtWriter = new StreamWriter(targetFilePath))
                    {
                        List <HtmlNode> scriptNodes = new List <HtmlNode>();

                        htmlDoc.Load(srcTxtReader);
                        htmlDoc.DocumentNode.SelectNodes("//script")?.ToList()
                        .ForEach(n =>
                        {
                            n.Remove();
                            scriptNodes.Add(n);
                        });

                        foreach (var node in htmlDoc.DocumentNode.ChildNodes)
                        {
                            scriptNodes.AddRange(TranslateHtmlNodes(node.ChildNodes, 0));
                        }

                        var body = htmlDoc.DocumentNode.SelectNodes("//body")
                                   .SingleOrDefault();

                        scriptNodes.ForEach(n =>
                        {
                            body?.ChildNodes.Add(HtmlNode.CreateNode(Environment.NewLine));
                            body?.ChildNodes.Add(n);
                        });

                        FormatHtmlNodes(htmlDoc.DocumentNode.ChildNodes, 0);
                        htmlDoc.OptionFixNestedTags = true;
                        htmlDoc.Save(tarTxtWriter);
                    }
                foreach (var includeFilePath in VisitedItems)
                {
                    if (ReferenceItems.ContainsKey(includeFilePath) == true)
                    {
                        if (ReferenceItems[includeFilePath].Contains(sourceFilePath) == false)
                        {
                            ReferenceItems[includeFilePath].Add(sourceFilePath);
                        }
                    }
                    else
                    {
                        ReferenceItems.Add(includeFilePath, new List <string>());
                        ReferenceItems[includeFilePath].Add(sourceFilePath);
                    }
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
        }
예제 #2
0
        protected bool HasCycle(string includeFilePath)
        {
            bool result = false;

            if (VisitedItems.Any(i => i.Equals(includeFilePath, StringComparison.CurrentCultureIgnoreCase)))
            {
                int visitedIdx = VisitedItems.Count - 1;

                List <string> periodItems = new List <string> {
                    includeFilePath
                };

                while (visitedIdx >= 0 && VisitedItems[visitedIdx].Equals(includeFilePath) == false)
                {
                    periodItems.Insert(0, VisitedItems[visitedIdx--]);
                }
                result = ContainsSubsequence(VisitedItems, periodItems);
            }
            return(result);
        }
예제 #3
0
        protected virtual HtmlNode[] TranslateHtmlNodes(HtmlNodeCollection nodes, int level)
        {
            List <HtmlNode> scriptNodes  = new List <HtmlNode>();
            List <HtmlNode> includeNodes = new List <HtmlNode>();

            if (nodes == null || level > MaxLevel)
            {
                return(scriptNodes.ToArray());
            }

            foreach (var node in nodes)
            {
                if (node.Name.ToLower().Contains(IncludeTagName) == true)
                {
                    includeNodes.Add(node);
                }
                else
                {
                    scriptNodes.AddRange(TranslateHtmlNodes(node.ChildNodes, level + 1));
                }
            }

            foreach (var node in includeNodes)
            {
                HtmlDocument htmlDoc = new HtmlDocument();

                try
                {
                    string includeFilePath = Path.Combine(WatchPath, node.InnerText);

                    VisitedItems.Add(includeFilePath);

                    using (var srcFs = new FileStream(includeFilePath, FileMode.Open, FileAccess.Read))
                        using (var srcTxtReader = new StreamReader(srcFs))
                        {
                            var content = srcTxtReader.ReadToEnd();

                            foreach (var attr in node.Attributes)
                            {
                                content = content.Replace(attr.Name, attr.Value);
                            }
                            htmlDoc.Load(new StringReader(content));
                            htmlDoc.DocumentNode.SelectNodes("//script")?.ToList()
                            .ForEach(n =>
                            {
                                n.Remove();
                                scriptNodes.Add(n);
                            });

                            foreach (var subNode in htmlDoc.DocumentNode.ChildNodes)
                            {
                                scriptNodes.AddRange(TranslateHtmlNodes(subNode.ChildNodes, level + 1));
                            }
                            node.ParentNode.ReplaceChild(htmlDoc.DocumentNode, node);
                        }
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }
            }
            return(scriptNodes.ToArray());
        }