Changeset 628


Ignore:
Timestamp:
12/16/13 16:31:52 (11 years ago)
Author:
ngw8
Message:

Much better support for wrapped text when converting web pages, strips out all links and in-paragraph formatting and is a bit messy + slow currently

Location:
trunk/src/org/expeditee
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/expeditee/io/WebParser.java

    r610 r628  
    2424import org.expeditee.items.Text;
    2525import org.expeditee.reflection.JavaFX;
     26import org.w3c.dom.Element;
    2627import org.w3c.dom.Node;
     28import org.w3c.dom.NodeList;
    2729import org.w3c.dom.html.HTMLBodyElement;
    2830
     
    136138                                                                new Object[] { "background-color" })));
    137139
     140                                                // Following 2 functions taken from jQuery (Apache 2 License)
     141                                        /*      JavaFX.WebEngineExecuteScript
     142                                                                .invoke(webEngine,
     143                                                                                "function getText ( elem ) { var i, node, nodeType = elem.nodeType, ret = ''; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 ) { if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { return elem.innerText.replace( rReturn, '' ); } else { for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { for ( i = 0; (node = elem[i]); i++ ) { if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; };");
     144                                                JavaFX.WebEngineExecuteScript
     145                                                                .invoke(webEngine,
     146                                                                                "function myText(elem) { var i, node, nodeType = elem.nodeType, ret = ''; if (nodeType) { if (nodeType === 1 || nodeType === 9 || nodeType === 11) { if (typeof elem.textContent === 'string') { return elem.textContent; } else if (typeof elem.innerText === 'string') { return elem.innerText.replace(rReturn, ''); } else { for (elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText(elem); } } } else if (nodeType === 3 || nodeType === 4) { return elem.nodeValue; } } else { for (i = 0; (node = elem[i]); i++) { if (node.nodeType !== 8) { ret += getText(node); } } } return ret; }");
     147               
     148                                                JavaFX.WebEngineExecuteScript.invoke(webEngine,
     149                                                                "var ps = document.getElementsByTagName('p');"
     150                                                                + "for(var i = 0; i < ps.length; i++) {"
     151                                                                        + "ps[i].innerHTML = myText(ps[i]);"
     152                                                                        + "var span = document.createElement('replacement');"
     153                                                                        + "span.textContent = ps[i].textContent;"
     154                                                                        + " ps[i].innerHTML = span.outerHTML;"
     155                                                                + "}" );
     156                                        */
     157                                               
     158                                                JavaFX.WebEngineExecuteScript
     159                                                                .invoke(webEngine,
     160                                                                                "function isContent(el) { "
     161                                                                                + "             if (el.tagName === 'li' && window.getComputedStyle(el).getPropertyValue('list-style-type') !== 'none') { "
     162                                                                                + "                     return true; "
     163                                                                                + "             } "
     164                                                                                + "             var text = el.textContent.replace(/(^\\s*)|(\\s*$)/, ''); "
     165                                                                                + "             var w = text.split(/\\S\\s\\S/).length; var punct = text.split(/\\.|\\,|\\!/).length; "
     166                                                                                + "             if (punct < 2 || w < 10) { "
     167                                                                                + "                     return false;"
     168                                                                                + "             } else { "
     169                                                                                + "                     return true;"
     170                                                                                + "             } "
     171                                                                                + "} "
     172                                                                                + "function addToSpan(text) {"
     173                                                                                + "             span = document.createElement('wordSpan');"
     174                                                                                + "             span.textContent = text + ' '; "
     175                                                                                + "             para.appendChild(span); "
     176                                                                                + "             if (prevSpan !== null && span.getBoundingClientRect().top > prevSpan.getBoundingClientRect().top) { "
     177                                                                                + "                     span.textContent = '\\n' + span.textContent;"
     178                                                                                + "                     if (prevPrevSpan !== null && prevPrevSpan.getBoundingClientRect().left == prevSpan.getBoundingClientRect().left) {"
     179                                                                                + "                             prevPrevSpan.textContent = prevPrevSpan.textContent + prevSpan.textContent;"
     180                                                                                + "                             para.removeChild(prevSpan);"
     181                                                                                + "                     } else {"
     182                                                                                + "                             prevPrevSpan = prevSpan;"
     183                                                                                + "                     }"
     184                                                                                + "                     prevSpan = span;"
     185                                                                               
     186                                                                                + "             } else {"
     187                                                                                + "                     prevSpan.textContent = prevSpan.textContent + span.textContent;"
     188                                                                                + "                     para.removeChild(span);"
     189                                                                                + "             }"
     190                                                                                + "}"   
     191                                                );
     192                                       
     193                                                Object contentElements = JavaFX.WebEngineExecuteScript.invoke(webEngine, "document.querySelectorAll('p,li');");
     194                                                int contentElementsLength = (Integer) JavaFX.JSObjectGetMember.invoke(contentElements, "length");
     195
     196                                                for (int i = 0; i < contentElementsLength; i++) {
     197                                                        Element currentNode = (Element) JavaFX.JSObjectGetSlot.invoke(contentElements, i);
     198                                                        // JavaFX.JSObjectCall.invoke(window, "addBreaks", new Object[] { currentNode });
     199                                                        JavaFX.JSObjectSetMember.invoke(window, "para", currentNode);
     200                                                       
     201                                                        JavaFX.WebEngineExecuteScript.invoke(webEngine, ""
     202                                                                        + "var exp = {};"
     203                                                                        + "var span = document.createElement('wordSpan');"
     204                                                                        + "var prevSpan = span;"
     205                                                                        + "var prevPrevSpan = null;"
     206                                                                        );
     207                                                       
     208                                                        if ((boolean) (JavaFX.WebEngineExecuteScript.invoke(webEngine, "isContent(para)"))) {
     209                                                                Object paraWords = JavaFX.WebEngineExecuteScript.invoke(webEngine, "para.textContent.split(/\\s+/);");
     210                                                                int paraWordsLength = (Integer) JavaFX.JSObjectGetMember.invoke(paraWords, "length");
     211                                                               
     212                                                                JavaFX.WebEngineExecuteScript.invoke(webEngine, ""
     213                                                                                + "para.innerHTML = '';"
     214                                                                                + "para.style.wordBreak = 'normal';"
     215                                                                                );
     216                                                               
     217                                                                for (int j = 0; j < paraWordsLength; j++) {
     218                                                                        Object currentWord = JavaFX.JSObjectGetSlot.invoke(paraWords, j);
     219                                                                        JavaFX.JSObjectCall.invoke(window, "addToSpan", new Object[] { currentWord });
     220                                                                }
     221                                                               
     222                                                                JavaFX.WebEngineExecuteScript.invoke(webEngine, ""
     223                                                                                + "                     if (prevPrevSpan !== null && prevPrevSpan.getBoundingClientRect().left == prevSpan.getBoundingClientRect().left) {"
     224                                                                                + "                             prevPrevSpan.textContent = prevPrevSpan.textContent + prevSpan.textContent;"
     225                                                                                + "                             para.removeChild(prevSpan);"
     226                                                                                + "                     }"
     227                                                                                );
     228                                                        }
     229                                                }
     230                                               
    138231                                                // Using Javascript to get an array of all the nodes in the document
    139232                                                Object nodes = JavaFX.WebEngineExecuteScript.invoke(webEngine,
     
    151244                                                for (int i = 0; i < nodesLength; i++) {
    152245                                                        Node currentNode = (Node) JavaFX.JSObjectGetSlot.invoke(nodes, i);
    153                                                        
     246
    154247                                                        if (currentNode.getNodeType() == Node.TEXT_NODE || currentNode.getNodeType() == Node.ELEMENT_NODE) {
    155248
     
    251344                                                                                }
    252345
     346                                                                                Node siblingNode;
     347                                                                                NodeList siblings = currentNode.getParentNode().getChildNodes();
     348
     349                                                                                String combined = currentNode.getTextContent();
     350
     351                                                                                for (int j = 0; j < siblings.getLength(); j++) {
     352                                                                                        siblingNode = siblings.item(j);
     353                                                                                        if (siblingNode.getNodeType() == Node.TEXT_NODE) {
     354                                                                                                System.out.println("sibling is text");
     355                                                                                                combined = combined + siblingNode.getTextContent();
     356                                                                                        }
     357                                                                                }
     358
     359                                                                                System.out.println("Combined: " + combined);
     360
     361
    253362                                                                                Text t;
    254363
    255                                                                                 t = frame.addText((int) x, (int) y, currentNode.getTextContent().replaceAll("\\s+", " ").trim(), null);
     364                                                                                t = frame.addText((int) x, (int) y, currentNode.getTextContent().replaceAll("[^\\S\\n]+", " ").trim(), null);
    256365
    257366                                                                                t.setColor(rgbStringToColor(color));
  • trunk/src/org/expeditee/reflection/JavaFX.java

    r577 r628  
    6666        public static Method JSObjectCall;
    6767        public static Method JSObjectGetMember;
     68        public static Method JSObjectSetMember;
    6869        public static Method JSObjectGetSlot;
    6970
     
    139140                        JSObjectCall = JSObject.getMethod("call", String.class, Object[].class);
    140141                        JSObjectGetMember = JSObject.getMethod("getMember", String.class);
     142                        JSObjectSetMember = JSObject.getMethod("setMember", String.class, Object.class);
    141143                        JSObjectGetSlot = JSObject.getMethod("getSlot", int.class);
    142144
Note: See TracChangeset for help on using the changeset viewer.