📄 parsedhtml.java
字号:
protected boolean isRecognized(ClientProperties properties)
{
return true;
}
protected boolean addToContext()
{
return false;
}
final protected ParsedHTML getParsedHTML(NodeUtils.PreOrderTraversal pot)
{
return (ParsedHTML) getClosestContext(pot, ParsedHTML.class);
}
final protected Object getClosestContext(NodeUtils.PreOrderTraversal pot, Class aClass)
{
return pot.getClosestContext(aClass);
}
protected ParsedHTML getRootContext(NodeUtils.PreOrderTraversal pot)
{
return (ParsedHTML) pot.getRootContext();
}
}
static class DefaultElementFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
if (element.getAttribute("id").equals(""))
return null;
return parsedHTML.toDefaultElement(element);
}
protected void addToLists(NodeUtils.PreOrderTraversal pot, HTMLElement htmlElement)
{
}
}
private HTMLElement toDefaultElement(Element element)
{
return new HTMLElementBase(element)
{
protected ScriptableDelegate newScriptable()
{
return new HTMLElementScriptable(this);
}
protected ScriptableDelegate getParentDelegate()
{
return getResponse().getScriptableObject().getDocument();
}
};
}
static class WebFormFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
return parsedHTML.toWebForm(element);
}
protected void addToLists(NodeUtils.PreOrderTraversal pot, HTMLElement htmlElement)
{
super.addToLists(pot, htmlElement);
getRootContext(pot)._activeForm = (WebForm) htmlElement;
}
}
static class WebLinkFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
return parsedHTML.toLinkAnchor(element);
}
}
static class TextBlockFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
return parsedHTML.toTextBlock(element);
}
protected boolean addToContext()
{
return true;
}
protected void addToLists(NodeUtils.PreOrderTraversal pot, HTMLElement htmlElement)
{
for (Iterator i = pot.getContexts(); i.hasNext();)
{
Object o = i.next();
if (!(o instanceof ParsedHTML))
continue;
((ParsedHTML) o).addToList(htmlElement);
break;
}
}
}
static class ScriptFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
return null;
}
void recordElement(NodeUtils.PreOrderTraversal pot, Element element, ParsedHTML parsedHTML)
{
parsedHTML.interpretScriptElement(element);
}
}
static class NoScriptFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
return parsedHTML.toNoscriptElement(element);
}
protected boolean addToContext()
{
return true;
}
}
static class WebFrameFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
return parsedHTML.toWebFrame(element);
}
}
static class WebIFrameFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
return parsedHTML.toWebIFrame(element);
}
protected boolean isRecognized(ClientProperties properties)
{
return properties.isIframeSupported();
}
protected boolean addToContext()
{
return true;
}
}
static class WebImageFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
return parsedHTML.toWebImage(element);
}
}
static class WebAppletFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
return parsedHTML.toWebApplet(element);
}
protected boolean addToContext()
{
return true;
}
}
static class WebTableFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
return parsedHTML.toWebTable(element);
}
protected boolean addToContext()
{
return true;
}
protected void addToLists(NodeUtils.PreOrderTraversal pot, HTMLElement htmlElement)
{
for (Iterator i = pot.getContexts(); i.hasNext();)
{
Object o = i.next();
if (o instanceof ParsedHTML)
((ParsedHTML) o).addToList(htmlElement);
if (o instanceof TableCell)
break;
}
}
}
static class TableRowFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
WebTable wt = getWebTable(pot);
if (wt == null)
return null;
return wt.newTableRow(element);
}
private WebTable getWebTable(NodeUtils.PreOrderTraversal pot)
{
return (WebTable) getClosestContext(pot, WebTable.class);
}
protected boolean addToContext()
{
return true;
}
protected void addToLists(NodeUtils.PreOrderTraversal pot, HTMLElement htmlElement)
{
getWebTable(pot).addRow((TableRow) htmlElement);
}
}
static class TableCellFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
TableRow tr = getTableRow(pot);
if (tr == null)
return null;
return tr.newTableCell(element);
}
private TableRow getTableRow(NodeUtils.PreOrderTraversal pot)
{
return (TableRow) getClosestContext(pot, TableRow.class);
}
protected boolean addToContext()
{
return true;
}
protected void addToLists(NodeUtils.PreOrderTraversal pot, HTMLElement htmlElement)
{
getTableRow(pot).addTableCell((TableCell) htmlElement);
}
}
static class FormControlFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
final WebForm form = getForm(pot);
return form == null ? newControlWithoutForm(parsedHTML, element) : form.newFormControl(element);
}
private HTMLElement newControlWithoutForm(ParsedHTML parsedHTML, Element element)
{
if ((element.getNodeName().equalsIgnoreCase("button") || element.getNodeName().equalsIgnoreCase("input"))
&& isValidNonFormButtonType(NodeUtils.getNodeAttribute(element, "type")))
{
return parsedHTML.toButtonWithoutForm(element);
}
else
{
return null;
}
}
private boolean isValidNonFormButtonType(String buttonType)
{
return buttonType.equals("") || buttonType.equalsIgnoreCase("button");
}
private WebForm getForm(NodeUtils.PreOrderTraversal pot)
{
return getRootContext(pot)._activeForm;
}
protected void addToLists(NodeUtils.PreOrderTraversal pot, HTMLElement htmlElement)
{
WebForm form = getForm(pot);
if (form != null)
form.addFormControl((FormControl) htmlElement);
}
}
static class WebListFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
return parsedHTML.toOrderedList(element);
}
protected boolean addToContext()
{
return true;
}
protected void addToLists(NodeUtils.PreOrderTraversal pot, HTMLElement htmlElement)
{
TextBlock textBlock = getTextBlock(pot);
if (textBlock != null)
textBlock.addList((WebList) htmlElement);
}
private TextBlock getTextBlock(NodeUtils.PreOrderTraversal pot)
{
return (TextBlock) getClosestContext(pot, TextBlock.class);
}
}
static class ListItemFactory extends HTMLElementFactory
{
HTMLElement toHTMLElement(NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element)
{
WebList webList = getWebList(pot);
if (webList == null)
return null;
return webList.addNewItem(element);
}
private WebList getWebList(NodeUtils.PreOrderTraversal pot)
{
return (WebList) getClosestContext(pot, WebList.class);
}
protected boolean addToContext()
{
return true;
}
protected void addToLists(NodeUtils.PreOrderTraversal pot, HTMLElement htmlElement)
{
}
}
private static HashMap _htmlFactoryClasses = new HashMap();
private static HTMLElementFactory _defaultFactory = new DefaultElementFactory();
static
{
_htmlFactoryClasses.put("a", new WebLinkFactory());
_htmlFactoryClasses.put("area", new WebLinkFactory());
_htmlFactoryClasses.put("form", new WebFormFactory());
_htmlFactoryClasses.put("img", new WebImageFactory());
_htmlFactoryClasses.put("applet", new WebAppletFactory());
_htmlFactoryClasses.put("table", new WebTableFactory());
_htmlFactoryClasses.put("tr", new TableRowFactory());
_htmlFactoryClasses.put("td", new TableCellFactory());
_htmlFactoryClasses.put("th", new TableCellFactory());
_htmlFactoryClasses.put("frame", new WebFrameFactory());
_htmlFactoryClasses.put("iframe", new WebIFrameFactory());
_htmlFactoryClasses.put("script", new ScriptFactory());
_htmlFactoryClasses.put("noscript", new NoScriptFactory());
_htmlFactoryClasses.put("ol", new WebListFactory());
_htmlFactoryClasses.put("ul", new WebListFactory());
_htmlFactoryClasses.put("li", new ListItemFactory());
for (int i = 0; i < TEXT_ELEMENTS.length; i++)
{
_htmlFactoryClasses.put(TEXT_ELEMENTS[i], new TextBlockFactory());
}
for (Iterator i = Arrays.asList(FormControl.getControlElementTags()).iterator(); i.hasNext();)
{
_htmlFactoryClasses.put(i.next(), new FormControlFactory());
}
}
private static HTMLElementFactory getHTMLElementFactory(String tagName)
{
final HTMLElementFactory factory = (HTMLElementFactory) _htmlFactoryClasses.get(tagName);
return factory != null ? factory : _defaultFactory;
}
private void loadElements()
{
if (!_updateElements)
return;
NodeUtils.NodeAction action = new NodeUtils.NodeAction()
{
public boolean processElement(NodeUtils.PreOrderTraversal pot, Element element)
{
HTMLElementFactory factory = getHTMLElementFactory(element.getNodeName().toLowerCase());
if (factory == null || !factory.isRecognized(getClientProperties()))
return true;
if (pot.getClosestContext(ContentConcealer.class) != null)
return true;
if (!_elements.containsKey(element))
factory.recordElement(pot, element, ParsedHTML.this);
if (factory.addToContext())
pot.pushContext(_elements.get(element));
return true;
}
public void processTextNode(NodeUtils.PreOrderTraversal pot, Node textNode)
{
if (textNode.getNodeValue().trim().length() == 0)
return;
Node parent = textNode.getParentNode();
if (!parent.getNodeName().equalsIgnoreCase("body"))
return;
if (pot.getClosestContext(ContentConcealer.class) != null)
return;
new HtmlElementRecorder().recordHtmlElement(pot, textNode, newTextBlock(textNode));
}
};
NodeUtils.PreOrderTraversal nt = new NodeUtils.PreOrderTraversal(getRootNode());
nt.pushBaseContext(this);
nt.perform(action);
_updateElements = false;
}
private ClientProperties getClientProperties()
{
WebWindow window = _response.getWindow();
return window == null ? ClientProperties.getDefaultProperties() : window.getClient().getClientProperties();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -