📄 parsedhtml.java
字号:
Object o = i.next(); if (o instanceof ParsedHTML) ((ParsedHTML) o).addToList( htmlElement ); } } protected void addToMaps( NodeUtils.PreOrderTraversal pot, Node node, HTMLElement htmlElement ) { for (Iterator i = pot.getContexts(); i.hasNext();) { Object o = i.next(); if (o instanceof ParsedHTML) ((ParsedHTML) o).addToMaps( node, htmlElement ); } } } abstract static class HTMLElementFactory extends HtmlElementRecorder { abstract HTMLElement toHTMLElement( NodeUtils.PreOrderTraversal pot, ParsedHTML parsedHTML, Element element ); void recordElement( NodeUtils.PreOrderTraversal pot, Element element, ParsedHTML parsedHTML ) { HTMLElement htmlElement = toHTMLElement( pot, parsedHTML, element ); recordHtmlElement( pot, element, htmlElement ); } 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(); } private Button toButtonWithoutForm( Element element ) { return new Button( _response, element ); } private WebForm toWebForm( Element element ) { return new WebForm( _response, _baseURL, element, _frame, _baseTarget, _characterSet ); } private WebFrame toWebFrame( Element element ) { return new WebFrame( _response, _baseURL, element, _frame ); } private WebFrame toWebIFrame( Element element ) { return new WebIFrame( _baseURL, element, _frame ); } private WebLink toLinkAnchor( Element child ) { return (!isWebLink( child )) ? null : new WebLink( _response, _baseURL, child, _frame, _baseTarget, _characterSet ); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -