How do I call DaisyDiff to compare two HTML files?

I need to create a difference between two HTML documents in my application. I found a library called DaisyDiff that can do this. It has an API that looks like this:

/**
 * Diffs two html files, outputting the result to the specified consumer.
 */
public static void diffHTML(InputSource oldSource, InputSource newSource,
                            ContentHandler consumer, String prefix, Locale locale)
        throws SAXException, IOException

      

I don't know anything about SAX and I can't figure out what to pass as the third argument. After scrolling through https://code.google.com/p/daisydiff/source/browse/trunk/daisydiff/src/java/org/outerj/daisy/diff/Main.java I wrote this method:

@Override
    protected String doInBackground(String... params)
    {
        try {
            String oldFileName = params[0],
                    newFileName = params[1];
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            FileInputStream oldis = null, newis = null;
            oldis = openFileInput(oldFileName);
            newis = openFileInput(newFileName);

            SAXTransformerFactory tf = (SAXTransformerFactory) TransformerFactory
                    .newInstance();

            TransformerHandler result = tf.newTransformerHandler();
            result.setResult(new StreamResult(os));
            DaisyDiff.diffHTML(new InputSource(oldis), new InputSource(newis), result, "", Locale.getDefault());

            Log.d("diff", "output length = " + os.size());
            return os.toString("Utf-8");

        }catch (Exception e){
            return e.toString();
        }
    }

      

I have no idea it even makes sense. It doesn't work, nothing is written to the output. Please help me with this. Thanks in advance.

+3


source to share


1 answer


According to how it is HtmlTestFixture.diff

coded (internally src/test/java

DaisyDiff

), you need to give it instructions on how the result should be formatted. Have you tried adding below setOutputProperty(...)

calls?

@Test 
//@Test comes from TestNG and is not related to DaisyDiff
public void daisyDiffTest() throws Exception {
    String html1 = "<html><body>var v2</body></html>";
    String html2 = "<html>  \n  <body>  \n  Hello world  \n  </body>  \n  </html>";

    try {
        StringWriter finalResult = new StringWriter();
        SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); 
        TransformerHandler result = tf.newTransformerHandler(); 
        result.getTransformer().setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
        result.getTransformer().setOutputProperty(OutputKeys.INDENT, "yes"); 
        result.getTransformer().setOutputProperty(OutputKeys.METHOD, "html"); 
        result.getTransformer().setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
        result.setResult(new StreamResult(finalResult)); 

        ContentHandler postProcess = result; 
        DaisyDiff.diffHTML(new InputSource(new StringReader(html1)), new InputSource(new StringReader(html2)), postProcess, "test", Locale.ENGLISH);
        System.out.println(finalResult.toString());
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

      



Let's do this, my output looks like this. Now I can paste this into an HTML file, include the correct css and js files, and get nice output.

<span class="diff-html-removed" id="removed-test-0" previous="first-test" changeId="removed-test-0" next="added-test-0">var v2</span><span class="diff-html-added" previous="removed-test-0" changeId="added-test-0" next="last-test"> </span><span class="diff-html-added" id="added-test-0" previous="removed-test-0" changeId="added-test-0" next="last-test">Hello world </span>

+1


source







All Articles