Changeset 886


Ignore:
Timestamp:
02/13/14 17:39:22 (10 years ago)
Author:
ngw8
Message:

Added a 'Reading Mode' to the JFXBrowser, which strips the page down to just the core content for easier reading (and tidier conversions, if you convert a page when it is enabled). The script is a modification of the 'Readability' bookmarklet (Apache 2 License, code.google.com/p/arc90labs-readability/), the main modifications being the removal of code that was unnecessary for the JFXBrowser, addition of zoom and font style buttons and a stylesheet that will work nicely with the Web Parser converter.

Also added code to the webparser that allows <pre> tags to be converted properly (without causing the page to become extremely wide)

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

Legend:

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

    r884 r886  
    365365                                                webEngine.executeScript(""
    366366                                                                // Setting all text to be hidden before taking the screenshot
    367                                                                 + "var style = 'WordSpan { visibility: hidden !important;}';"
    368                                                                 + "cssHide.appendChild(document.createTextNode(style));");
     367                                                                + "cssHide.appendChild(document.createTextNode(wordSpanHiddenStyle));");
    369368                                               
    370369                                                WritableImage img = new WritableImage((int)webView.getWidth(), (int)webView.getHeight());
     
    434433                                                                + "var scrollCounterHorizontal = 0;");
    435434
    436                                                 // Setting up the element that contains the CSS to hide all text.
     435                                                // Setting up the element that contains the CSS to hide all text. Also hiding readability mode buttons.
    437436                                                // This is wiped before the text is converted, then re-added before taking the screenshot
    438437                                                webEngine.executeScript(""
    439438                                                                + "var cssHide = document.createElement('style');"
    440439                                                                + "cssHide.type = 'text/css';"
    441                                                                 + "var style = 'WordSpan { visibility: hidden !important;}';"
    442                                                                 + "cssHide.appendChild(document.createTextNode(style));"
    443                                                                 + "document.getElementsByTagName('head')[0].appendChild(cssHide);");
     440                                                                + "var wordSpanHiddenStyle = 'WordSpan, #readOverlay #readTools { visibility: hidden !important;}';"
     441                                                                + "cssHide.appendChild(document.createTextNode(wordSpanHiddenStyle));"
     442                                                                + "document.getElementsByTagName('head')[0].appendChild(cssHide);"
     443                                                                );
     444                                               
     445                                                // Replacing line breaks in all <pre> tags with <br> tags, otherwise they are lost during the conversion
     446                                                webEngine.executeScript(""
     447                                                                + "var pres = document.getElementsByTagName ('pre');"
     448                                                                + "for(var i = 0; i < pres.length; i++){"
     449                                                                + "             pres[i].innerHTML = pres[i].innerHTML.replace(/\\n|\\r/g, '<br />');"
     450                                                                + "}");
    444451
    445452                                                // Functions to be used later in JavaScript
  • trunk/src/org/expeditee/items/widgets/JfxBrowser.java

    r883 r886  
    1010 */
    1111import java.awt.Point;
     12import java.io.BufferedReader;
     13import java.io.IOException;
     14import java.io.InputStreamReader;
    1215import java.lang.reflect.Field;
    1316
     
    3336import javafx.scene.control.ProgressIndicator;
    3437import javafx.scene.control.TextField;
     38import javafx.scene.control.ToggleButton;
     39import javafx.scene.control.Tooltip;
     40import javafx.scene.image.Image;
     41import javafx.scene.image.ImageView;
    3542import javafx.scene.input.KeyEvent;
    3643import javafx.scene.input.MouseButton;
     
    8390        private Button _backButton;
    8491        private Button _convertButton;
     92        private ToggleButton _readableModeButton;
    8593
    8694        private TextField _urlField;
     
    192200                        goButton.setMinWidth(Button.USE_PREF_SIZE);
    193201                        goButton.setFocusTraversable(false);
    194 
     202                       
     203                        this._readableModeButton = new ToggleButton();
     204                        this._readableModeButton.setMinWidth(Button.USE_PREF_SIZE);
     205                        this._readableModeButton.setFocusTraversable(false);
     206                        this._readableModeButton.setTooltip(new Tooltip("Switch to an easy-to-read view of the page"));
     207                       
     208                        Image readableModeIcon = new Image(ClassLoader.getSystemResourceAsStream("org/expeditee/assets/images/readableModeIcon.png"));
     209                        this._readableModeButton.setGraphic(new ImageView(readableModeIcon));
     210                       
    195211                        this._convertButton = new Button("Convert");
    196212                        this._convertButton.setMinWidth(Button.USE_PREF_SIZE);
     
    204220                        urlbar.getChildren().addAll(_urlProgressBar, this._urlField);
    205221                                               
    206                         horizontal.getChildren().addAll(this._backButton, this._forwardButton, urlbar, goButton, this._convertButton);
     222                        horizontal.getChildren().addAll(this._backButton, this._forwardButton, urlbar, goButton, this._readableModeButton, this._convertButton);
    207223
    208224                        HBox.setHgrow(this._backButton, Priority.NEVER);
     
    210226                        HBox.setHgrow(this._convertButton, Priority.NEVER);
    211227                        HBox.setHgrow(goButton, Priority.NEVER);
     228                        HBox.setHgrow(this._readableModeButton, Priority.NEVER);
    212229                        HBox.setHgrow(urlbar, Priority.ALWAYS);
    213230                       
    214231                        HBox.setMargin(goButton, new Insets(0, 5, 0, 0));
     232                        HBox.setMargin(this._readableModeButton, new Insets(0, 5, 0, 0));
    215233                        HBox.setMargin(this._forwardButton, new Insets(0, 5, 0, 0));
    216234
     
    274292                       
    275293                        final String cssPath = ClassLoader.getSystemResource("org/expeditee/assets/style/jfx.css").toString();
     294                       
    276295                        scene.getStylesheets().add(cssPath);
    277296               
     
    314333                                public void handle(ActionEvent arg0) {
    315334                    navigate(JfxBrowser.this._urlField.getText());
     335                                }
     336                        });
     337                       
     338                        this._readableModeButton.setOnAction(new EventHandler<ActionEvent>() {
     339
     340                                @Override
     341                                public void handle(ActionEvent arg0) {
     342                                        if (arg0.getSource() instanceof ToggleButton) {
     343                                                ToggleButton source = (ToggleButton) arg0.getSource();
     344                                               
     345                                                // This seems backwards, but because the button's just been clicked, its state has already changed
     346                                                if(!source.isSelected()) {
     347                                                        // Disable readable mode by refreshing the page
     348                                                        JfxBrowser.this._webEngine.reload();
     349                                                } else {
     350                                                        JfxBrowser.this.enableReadableMode();
     351                                                }
     352                                        }
    316353                                }
    317354                        });
     
    472509
    473510                                                JfxBrowser.this._convertButton.setDisable(true);
     511                                                JfxBrowser.this._readableModeButton.setDisable(true);
    474512
    475513                                                break;
     
    477515                                                MessageBay.displayMessage("Finished loading page");
    478516                                                JfxBrowser.this._urlProgressBar.getStyleClass().add("completed");
     517                                               
     518                                                if(JfxBrowser.this._readableModeButton.isSelected()) {
     519                                                        JfxBrowser.this.enableReadableMode();
     520                                                }
    479521
    480522                                        case CANCELLED: // CANCELLED
    481523                                                JfxBrowser.this._convertButton.setDisable(false);
     524                                                JfxBrowser.this._readableModeButton.setDisable(false);
    482525                                                break;
    483526                                        case FAILED: // FAILED
     
    858901                return r;
    859902        }
     903       
     904        private void enableReadableMode() {
     905                String readabilityJs;
     906                String readabilityCss;
     907
     908                readabilityJs = readResourceFile("org/expeditee/assets/scripts/browserreadablemode/readability.min.js");
     909                readabilityCss = readResourceFile("org/expeditee/assets/scripts/browserreadablemode/readability.css");
     910                       
     911                JSObject window = (JSObject)JfxBrowser.this._webEngine.executeScript("window");
     912                window.setMember("readabilityJs", readabilityJs);
     913                window.setMember("readabilityCss", readabilityCss);
     914               
     915                JfxBrowser.this._webEngine.executeScript(""
     916                                + "javascript:("
     917                                        + "function(){  "
     918                                                + "readStyle = '';"
     919                                                + "readSize = 'size-medium';"
     920                                                + "readMargin = 'margin-medium';"
     921                                                + "_readability_script = document.createElement('SCRIPT');"
     922                                                + "_readability_script.type = 'text/javascript';"
     923                                                + "_readability_script.appendChild(document.createTextNode(readabilityJs));"
     924                                                + "document.head.appendChild(_readability_script);"
     925                                                + "readability.init();"
     926                                               
     927                                                // readability.init() removes all css, so have to add the stylesheet after init
     928                                                + "_readability_css = document.createElement('STYLE');"
     929                                                + "_readability_css.type='text/css';"
     930                                                + "_readability_css.appendChild(document.createTextNode(readabilityCss));"
     931                                                + "document.head.appendChild(_readability_css);"
     932                                               
     933                                                // Font Awesome CSS from the Bootstrap CDN
     934                                                + "_fontawesome_css = document.createElement('LINK');"
     935                                                + "_fontawesome_css.rel = 'stylesheet'; "
     936                                                + "_fontawesome_css.href = '//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css';"
     937                                                + "_fontawesome_css.type = 'text/css';"
     938                                                + "document.head.appendChild(_fontawesome_css);"
     939                                        + "}"
     940                                + ")();"
     941                   );
     942        }
     943       
     944        /**
     945         * Reads a resource file into a string
     946         * @return The contents of the specified file as a string
     947         */
     948        private static String readResourceFile(String path) {
     949                BufferedReader bufferedReader = null;
     950                StringBuilder stringBuilder = new StringBuilder();
     951 
     952                String line;
     953               
     954                try {
     955                        bufferedReader = new BufferedReader(new InputStreamReader(ClassLoader.getSystemResourceAsStream(path)));
     956
     957                        while ((line = bufferedReader.readLine()) != null) {
     958                                stringBuilder.append(line + "\n");
     959                        }
     960 
     961                } catch (IOException e) {
     962                        e.printStackTrace();
     963                } finally {
     964                        if (bufferedReader != null) {
     965                                try {
     966                                        bufferedReader.close();
     967                                } catch (IOException e) {
     968                                        e.printStackTrace();
     969                                }
     970                        }
     971                }
     972 
     973                return stringBuilder.toString();
     974        }
    860975}
Note: See TracChangeset for help on using the changeset viewer.