Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to diff 2 notebooks at the source level?

Any one knows a tool to find difference between 2 notebooks at the source level?

The compare notebooks tool in workbench 2 seems to work at the internal data structure level which is not useful for me. I am looking for tool that looks at differences at the source level (what one sees when looking at a notebook, i.e. not the FullForm).

I am using V8 of Mathematica on windows.

EDIT1:

How I display the output/report from NotebookDiff in a more readable form?

enter image description here

like image 745
Nasser Avatar asked Jun 30 '11 00:06

Nasser


3 Answers

This answer is based on discussion in the comments to other parts of this question. It also could (and should) be automated if it's going to be used with any regularity. This could be done by tagging the cells you want compared and using NotebookFind to find the cells for extraction and comparison.


A solution for comparing just a single large cell of code (as sometimes occurs when makeing demonstrations) is to copy the code in InputForm from both notebooks

enter image description here

and paste it into a simple diff tool such as Quick Diff Online which will then display the standard diff for you:

enter image description here

The above code was taken from one of Nasser's demonstrations.


Another option is to use CellDiff from the AuthorTools package.

Needs["AuthorTools`"];
CellDiff[Cell["Some text.", "Text"], 
         Cell["Some different text.", "Text"]]

CellDiff

To use on your demonstrations you can copy the cell expressions from the two versions by right clicking on the cell brackets:

enter image description here

like image 184
Simon Avatar answered Nov 19 '22 06:11

Simon


There is an undocumented package in the built-in add-ons (in $InstallationDirectory/AddOns/Applications) called AuthorTools. Once loaded, it exposes a NotebookDiff function which provides some basic diff features:

Needs["AuthorTools`"];

nb1 = NotebookPut[
  Notebook[{Cell["Subsection heading", "Subsection"], 
    Cell["Some text.", "Text"]}]];

nb2 = NotebookPut[
  Notebook[{Cell["Edited Subsection heading", "Subsection"], 
    Cell["Some different text.", "Text"]}]];

NotebookPut@NotebookDiff[nb1, nb2]

As this package is undocumented, please realize it is potentially buggy and is not considered a supported feature, but hopefully you still find it useful.

Note that you can also get handles to notebooks with e.g.:

nb1 = NotebookOpen["path/to/a/notebook.nb"]

and a list of notebooks currently open in the front end

Notebooks[]
like image 9
Michael Pilat Avatar answered Nov 19 '22 05:11

Michael Pilat


If you must work with notebooks then NotebookDiff in AuthorTools is probably your best bet. If this is an important part of your workflow (due to version control or some other constraint) and you have some flexibility you may want to consider moving the code from the existing notebook (.nb) into a package file (.m), which will be saved as plain text. You can still open and edit package files in the Mathematica notebook front end, but you get the added benefit of being able to diff them using existing text diffing tools.

like image 2
ragfield Avatar answered Nov 19 '22 06:11

ragfield