protected override void OnBeginTag(BeginTag tag)
        {
            if (tag == null)
                return;

            if (_firstTag)
            {
                if (!tag.NameEquals(HTMLTokens.Html))
                    EmitTag(HTMLTokens.Html);
                _firstTag = false;
            }

            if (!_seenHead && !TagPermittedAboveBody(tag))
            {
                Emit("<head>");
                EmitAdditionalMetaData();
                Emit("</head>");
                _seenHead = true;
            }

            if (tag.NameEquals(HTMLTokens.Script))
            {
                if (!tag.Complete)
                    _scriptDepth++;
                return;
            }

            if (tag.NameEquals(HTMLTokens.Head))
                _seenHead = true;
            else if (!_seenBody && !tag.NameEquals(HTMLTokens.Body))
            {
                if (!TagPermittedAboveBody(tag))
                {
                    EmitTag(HTMLTokens.Body);
                    _seenBody = true;
                }
            }
            else if (!_seenBody && tag.NameEquals(HTMLTokens.Body))
                _seenBody = true;

            if (tag.NameEquals(HTMLTokens.Base))
            {
                if (_metaData == null || _metaData.Base == null)
                    return;
                else
                {
                    Attr href = tag.GetAttribute(HTMLTokens.Href);
                    if (href != null)
                        href.Value = _metaData.Base;
                }
                _emittedMetaData.Add(HTMLTokens.Base);
            }

            if (tag.NameEquals(HTMLTokens.Meta))
                ModifyMetaDataAsNecessary(tag);

            foreach (Attr attr in tag.Attributes)
                if (attr != null)
                {
                    if (IsScriptAttribute(attr))
                        tag.RemoveAttribute(attr.Name);
                    else
                        attr.Value = ReplaceValue(attr.Value);
                }

            Emit(tag.ToString());
            base.OnBeginTag(tag);
        }
        public static void RemoveSmartContentAttributes(BeginTag beginTag)
        {
            if (beginTag == null)
                throw new ArgumentNullException("beginTag");

            Attr classAttr = beginTag.GetAttribute("class");

            // Remove the SmartContent classes.
            if (classAttr != null)
            {
                classAttr.Value = classAttr.Value.Replace(EDITABLE_SMART_CONTENT, string.Empty);
                classAttr.Value = classAttr.Value.Replace(SMART_CONTENT, string.Empty);
            }

            // Remove contentEditable=true so that the user can edit it manually.
            beginTag.RemoveAttribute("contentEditable");
        }