Exemplo n.º 1
0
        /// <summary>
        /// Parses source code.
        /// </summary>
        /// <param name="source">The source code which will be parsed.</param>
        /// <param name="scannerResult">The result returned by the scanners after scanning the source code.</param>
        /// <returns>The highlighted source code.</returns>
        public override string Parse(string source, IList <Occurrence> scannerResult)
        {
            StringWriter    htmlStringWriter = new StringWriter();
            XhtmlTextWriter htmlWriter       = new XhtmlTextWriter(htmlStringWriter);

            int lastIndex = 0;

            for (int i = 0; i < scannerResult.Count; i++)
            {
                if ((scannerResult[i].Start - lastIndex) >= 0)
                {
                    if (scannerResult[i].Start > 0)
                    {
                        // Encode non-highlighted text first.
                        htmlWriter.WriteEncodedText(source.Substring(lastIndex, scannerResult[i].Start - lastIndex));
                    }

                    htmlWriter.Write(this.ParseToken(source.Substring(scannerResult[i].Start, scannerResult[i].Length), scannerResult[i].Node));
                }

                lastIndex = scannerResult[i].Start + scannerResult[i].Length;
            }

            // Encode the last bit of nonhighlighted text.
            if (lastIndex < source.Length)
            {
                htmlWriter.WriteEncodedText(source.Substring(lastIndex));
            }

            string result = htmlStringWriter.ToString();

            htmlWriter.Close();
            htmlStringWriter.Close();

            return(result);
        }
        private void AddNode(UfDataNode node, UfElementDescriber elementDescriber, XhtmlTextWriter writer)
        {
            if (node.Name != string.Empty)
            {
                indentNum++;
                writer.Indent = indentNum;

                UfElementDescriber currentDescriber = elementDescriber;
                foreach (UfElementDescriber childElementDescriber in elementDescriber.Elements)
                {
                    if (node.Name == childElementDescriber.Name || node.Name == childElementDescriber.CompoundName)
                    {
                        currentDescriber = childElementDescriber;
                    }
                }

                if (currentDescriber.Attribute == "class")
                {
                    writer.WriteBeginTag("div");
                    if (currentDescriber.CompoundName == "")
                    {
                        writer.WriteAttribute("class", node.Name);
                    }
                    else
                    {
                        writer.WriteAttribute("class", node.Name + " " + currentDescriber.Name);
                    }

                    if (!string.IsNullOrEmpty(node.ElementId))
                    {
                        writer.WriteAttribute("id", node.ElementId);
                    }

                    writer.Write(HtmlTextWriter.TagRightChar);
                    writer.WriteEncodedText(node.Value);


                    foreach (UfDataNode child in node.Nodes)
                    {
                        writer.WriteLine();
                        AddNode(child, currentDescriber, writer);
                    }


                    if (node.Name != string.Empty)
                    {
                        writer.WriteEndTag("div");
                        writer.WriteLine();
                    }
                }

                if (currentDescriber.Attribute == "rel")
                {
                    writer.WriteBeginTag("a");
                    writer.WriteAttribute("href", node.DescendantValue("link"));
                    writer.WriteAttribute("rel", node.Name);
                    writer.Write(HtmlTextWriter.TagRightChar);

                    writer.WriteEncodedText(node.DescendantValue("text"));
                    writer.WriteEndTag("a");
                    writer.WriteLine();
                }

                indentNum--;
                writer.Indent = indentNum;
            }
        }