Ejemplo n.º 1
0
        public override XmlParserState PushChar(char c, IXmlParserContext context, ref string rollback)
        {
            if (context.CurrentStateLength == 1 && context.PreviousState is HtmlScriptBodyState)
            {
                return(Parent);
            }

            //NOTE: This is (mostly) duplicated in HtmlClosingTagState
            //handle "paragraph" tags implicitly closed by block-level elements
            if (context.CurrentStateLength == 1 && context.PreviousState is XmlNameState)
            {
                var element = (XElement)context.Nodes.Peek();

                if (!element.Name.HasPrefix && element.Name.IsValid)
                {
                    //Note: the node stack will always be at least 1 deep due to the XDocument
                    var parent = context.Nodes.Peek(1) as XElement;

                    while (parent != null && parent.ValidAndNoPrefix() && parent.IsImplicitlyClosedBy(element))
                    {
                        context.Nodes.Pop();
                        context.Nodes.Pop();
                        //parent.Region.End = element.Region.Start;
                        //parent.Region.EndColumn = Math.Max (parent.Region.EndColumn - 1, 1);
                        parent.Close(parent);
                        context.Nodes.Push(element);

                        parent = context.Nodes.Peek(1) as XElement;
                    }
                }
            }

            XmlParserState ret = base.PushChar(c, context, ref rollback);

            if (ret == Parent && c == '>')
            {
                var element = context.Nodes.Peek() as XElement;
                if (element != null && !element.Name.HasPrefix && element.Name.IsValid)
                {
                    if (element.Name.Name.Equals("script", StringComparison.OrdinalIgnoreCase))
                    {
                        return(scriptState);
                    }
                    if (ElementTypes.IsEmpty(element.Name.Name))
                    {
                        element.Close(element);
                        context.Nodes.Pop();
                    }
                }
            }

            return(ret);
        }
Ejemplo n.º 2
0
 public override XmlParserState ParseClosingBracket <T> (char c, IXmlParserContext context, XmlParserState stateToReturn)
 {
     if (base.ParseClosingBracket <T> (c, context, stateToReturn) != null)
     {
         if (RazorSymbols.CanBeContinued(CorrespondingBlock.Name))
         {
             keys             = RazorSymbols.PossibleKeywordsAfter(CorrespondingBlock.Name);
             context.StateTag = POSSIBLE_CONTINUATION;
         }
         else
         {
             return(stateToReturn);
         }
     }
     return(null);
 }
Ejemplo n.º 3
0
        public virtual XmlParserState ParseClosingBracket <T> (char c, IXmlParserContext context, XmlParserState stateToReturn) where T : XNode
        {
            bool isEnding  = false;
            var  rootState = RootState as RazorRootState;

            if (rootState.UseSimplifiedBracketTracker)
            {
                if (bracketsBuilder.Length > 0)
                {
                    bracketsBuilder.Remove(0, 1);
                }
                if (bracketsBuilder.Length == 0)
                {
                    isEnding = true;
                }
            }
            else if (!rootState.UseSimplifiedBracketTracker && CorrespondingBlock.IsEndingBracket(context.LocationMinus(1)))
            {
                isEnding = true;
            }

            if (isEnding)
            {
                StateEngineService.EndCodeFragment <T> (context);
                return(stateToReturn);
            }

            return(null);
        }