public override IPipeline Close(IWorkerContext context, Tag t, ProcessObject po)
{
HtmlPipelineContext hcc = (HtmlPipelineContext)GetLocalContext(context);
ITagProcessor tp;
try {
tp = hcc.ResolveProcessor(t.Name, t.NameSpace);
IList<IElement> elems = null;
if (tp.IsStackOwner()) {
// remove the element from the StackKeeper Queue if end tag is
// found
StackKeeper tagStack;
try {
tagStack = hcc.Poll();
} catch (NoStackException e) {
throw new PipelineException(String.Format(LocaleMessages.GetInstance().GetMessage(LocaleMessages.STACK_404), t.ToString()), e);
}
elems = tp.EndElement(context, t, tagStack.GetElements());
} else {
elems = tp.EndElement(context, t, hcc.CurrentContent());
hcc.CurrentContent().Clear();
}
if (elems.Count > 0) {
try {
StackKeeper stack = hcc.Peek();
foreach (IElement elem in elems) {
stack.Add(elem);
}
} catch (NoStackException) {
WritableElement writableElement = new WritableElement();
po.Add(writableElement);
writableElement.AddAll(elems);
}
}
} catch (NoTagProcessorException e) {
if (!hcc.AcceptUnknown()) {
throw e;
}
}
return GetNext();
}