protected override void ShallowCopyFrom(XObject copyFrom) { base.ShallowCopyFrom(copyFrom); XDocType copyFromDT = (XDocType)copyFrom; //immutable types RootElement = copyFromDT.RootElement; PublicFpi = copyFromDT.PublicFpi; InternalDeclarationRegion = copyFromDT.InternalDeclarationRegion; Uri = copyFromDT.Uri; }
void CreateDocType () { DocType = new XDocType (TextLocation.Empty); var matches = DocTypeRegex.Match (razorDocument.PageInfo.DocType); if (matches.Success) { DocType.PublicFpi = matches.Groups ["fpi"].Value; DocType.Uri = matches.Groups ["uri"].Value; } }
void HandleDocType (XDocType docType) { DocType = "<!DOCTYPE html"; if (!string.IsNullOrEmpty (docType.PublicFpi)) DocType += " \"" + docType.PublicFpi + "\""; if (!string.IsNullOrEmpty (docType.Uri)) DocType += " \"" + docType.Uri + "\""; DocType += ">"; }
public override XmlParserState PushChar (char c, IXmlParserContext context, ref string rollback) { var doc = context.Nodes.Peek () as XDocType; if (doc == null) { doc = new XDocType (context.LocationMinus ("<!DOCTYPE".Length + 1)); context.Nodes.Push (doc); } if (!doc.RootElement.IsValid) { if (XmlChar.IsWhitespace (c)) return null; else if (XmlChar.IsFirstNameChar (c)) { rollback = ""; return nameState; } } else if (doc.PublicFpi == null) { if (context.StateTag == 0) { if (c == 's' || c == 'S') { context.StateTag = 1; return null; } else if (c == 'p' || c == 'P') { context.StateTag = -1; return null; } if (XmlChar.IsWhitespace (c)) { return null; } } else if (Math.Abs (context.StateTag) < 6) { if (context.StateTag > 0) { if ("YSTEM"[context.StateTag - 1] == c || "ystem"[context.StateTag - 1] == c) { context.StateTag++; if (context.StateTag == 6) { context.StateTag = 0; doc.PublicFpi = ""; } return null; } } else { int absState = Math.Abs (context.StateTag) - 1; if ("UBLIC"[absState] == c || "ublic"[absState] == c) { context.StateTag--; return null; } } } else { if (context.KeywordBuilder.Length == 0) { if (XmlChar.IsWhitespace (c)) return null; else if (c == '"') { context.KeywordBuilder.Append (c); return null; } } else { if (c == '"') { context.KeywordBuilder.Remove (0,1); doc.PublicFpi = context.KeywordBuilder.ToString (); context.KeywordBuilder.Length = 0; context.StateTag = 0; } else { context.KeywordBuilder.Append (c); } return null; } } } else if (doc.Uri == null) { if (context.KeywordBuilder.Length == 0) { if (XmlChar.IsWhitespace (c)) return null; else if (c == '"') { context.KeywordBuilder.Append (c); return null; } } else { if (c == '"') { context.KeywordBuilder.Remove (0,1); doc.Uri = context.KeywordBuilder.ToString (); context.KeywordBuilder.Length = 0; } else { context.KeywordBuilder.Append (c); } return null; } } else if (doc.InternalDeclarationRegion.EndLine <= 0) { if (XmlChar.IsWhitespace (c)) return null; switch (context.StateTag) { case 0: if (c == '[') { doc.InternalDeclarationRegion = new DocumentRegion (context.Location, DocumentLocation.Empty); context.StateTag = 1; return null; } break; case 1: if (c == '<') { context.StateTag = 2; return null; } else if (c == ']') { context.StateTag = 0; doc.InternalDeclarationRegion = new DocumentRegion (doc.InternalDeclarationRegion.Begin, context.Location); return null; } break; case 2: if (c == '>') { context.StateTag = 1; } return null; default: throw new InvalidOperationException (); } } doc = (XDocType)context.Nodes.Pop (); if (c == '<') { rollback = string.Empty; context.LogError ("Doctype ended prematurely."); } else if (c != '>') { context.LogError ("Unexpected character '" + c +"' in doctype."); } if (context.BuildTree) { doc.End (context.Location); ((XContainer) context.Nodes.Peek ()).AddChildNode (doc); } return Parent; }