2015-12-24 11:27:07 +00:00
# diff2html
2014-08-30 02:54:52 +00:00
2018-08-09 09:20:37 +00:00
[](https://www.codacy.com/app/rtfpessoa/diff2html?utm_source=github.com& utm_medium=referral& utm_content=rtfpessoa/diff2html& utm_campaign=Badge_Grade)
[](https://www.codacy.com/app/rtfpessoa/diff2html?utm_source=github.com& utm_medium=referral& utm_content=rtfpessoa/diff2html& utm_campaign=Badge_Coverage)
2016-07-12 12:13:44 +00:00
[](https://circleci.com/gh/rtfpessoa/diff2html)
[](https://dependencyci.com/github/rtfpessoa/diff2html)
2015-12-20 22:22:26 +00:00
2015-12-24 11:27:07 +00:00
[](https://www.npmjs.com/package/diff2html)
2016-02-13 00:35:01 +00:00
[](https://david-dm.org/rtfpessoa/diff2html)
2016-02-13 00:35:54 +00:00
[](https://david-dm.org/rtfpessoa/diff2html#info=devDependencies)
2015-12-24 11:27:07 +00:00
[]()
[]()
[](https://www.npmjs.com/package/diff2html)
[](https://gitter.im/rtfpessoa/diff2html?utm_source=badge& utm_medium=badge& utm_campaign=pr-badge)
2016-05-06 22:19:12 +00:00
diff2html generates pretty HTML diffs from git or unified diff output.
2015-12-24 11:27:07 +00:00
[](https://nodei.co/npm/diff2html/)
2014-08-30 02:54:52 +00:00
## Features
2016-05-06 22:19:12 +00:00
* Supports git and unified diffs
2016-05-01 19:52:25 +00:00
* Line by line and Side by side diff
2014-08-30 02:54:52 +00:00
2016-05-01 19:52:25 +00:00
* New and old line numbers
2014-08-30 02:54:52 +00:00
2016-05-01 19:52:25 +00:00
* Inserted and removed lines
2014-08-30 22:33:12 +00:00
2014-08-30 02:54:52 +00:00
* GitHub like style
2015-07-19 21:34:46 +00:00
* Code syntax highlight
2015-11-25 16:37:26 +00:00
* Line similarity matching
2016-05-01 19:52:25 +00:00
* Easy code selection
2014-09-14 19:50:17 +00:00
## Online Example
2014-08-30 02:54:52 +00:00
2016-07-23 09:20:29 +00:00
> Go to [diff2html](https://diff2html.xyz/)
2014-08-30 22:33:12 +00:00
2014-09-08 17:15:51 +00:00
## Distributions
* [WebJar ](http://www.webjars.org/ )
* [Node Module ](https://www.npmjs.org/package/diff2html )
2015-07-18 23:23:36 +00:00
* [Bower Package ](http://bower.io/search/?q=diff2html )
2015-07-19 21:08:17 +00:00
* [Node CLI ](https://www.npmjs.org/package/diff2html-cli )
2015-07-18 23:23:36 +00:00
* Manually download and import `dist/diff2html.min.js` into your page
2014-09-08 17:15:51 +00:00
## How to use
2019-05-23 19:43:12 +00:00
To load correctly in the Browser you always need to include the stylesheet in the final HTML.
Import the stylesheet
```html
<!-- CSS -->
< link rel = "stylesheet" type = "text/css" href = "dist/diff2html.css" >
```
You can also refer to it from a CDN like [CDNJS ](https://cdnjs.com/libraries/diff2html ).
2016-08-23 16:24:43 +00:00
### Browser Library
Import the stylesheet and the library code
```html
<!-- CSS -->
< link rel = "stylesheet" type = "text/css" href = "dist/diff2html.css" >
<!-- Javascripts -->
< script type = "text/javascript" src = "dist/diff2html.js" > < / script >
```
It will now be available as a global variable named `Diff2Html` .
2018-06-24 13:38:54 +00:00
```js
var diffHtml = Diff2Html.getPrettyHtml(
'< Unified Diff String > ',
{inputFormat: 'diff', showFiles: true, matching: 'lines', outputFormat: 'side-by-side'}
);
document.getElementById("destination-elem-id").innerHTML = diffHtml;
```
2016-08-23 16:24:43 +00:00
### Node Module
```js
2017-06-20 10:47:52 +00:00
let diff2html = require("diff2html").Diff2Html
2016-08-23 16:24:43 +00:00
```
2017-10-23 02:54:53 +00:00
### Angular
* Typescript
```typescript
// import diff2html
import {Diff2Html} from 'diff2html'
import {Component, OnInit} from '@angular/core';
export class AppDiffComponent implements OnInit {
outputHtml: string;
constructor() {
this.init();
}
ngOnInit() {
}
init() {
let strInput = "--- a/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n+++ b/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (\n \n // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n \n+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n+\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n+\tn = int(r0)\n+\tif e1 != 0 {\n+\t\terr = errnoErr(e1)\n+\t}\n+\treturn\n+}\n+\n+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n+\n func read(fd int, p []byte) (n int, err error) {\n \tvar _p0 unsafe.Pointer\n \tif len(p) > 0 {\n";
let outputHtml = Diff2Html.getPrettyHtml(strInput, {inputFormat: 'diff', showFiles: true, matching: 'lines'});
this.outputHtml = outputHtml;
}
}
```
* HTML
```html
<!DOCTYPE html>
< html >
< head >
< title > diff2html< / title >
< / head >
< body >
< div [ innerHtml ] = " outputHtml " > < / div >
< / body >
< / html >
```
* `.angular-cli.json` - Add styles
```json
"styles": [
"diff2html.min.css"
]
```
2018-11-14 22:18:32 +00:00
### Vue.js
```vue
< template >
2019-03-13 17:24:40 +00:00
< div v-html = "prettyHtml" / >
2018-11-14 22:18:32 +00:00
< / template >
< script >
import { Diff2Html } from "diff2html";
import "diff2html/dist/diff2html.min.css";
export default {
2019-03-13 17:24:40 +00:00
data() {
2018-11-14 22:18:32 +00:00
return {
diffs: "--- a/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n+++ b/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (\n \n // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n \n+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n+\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n+\tn = int(r0)\n+\tif e1 != 0 {\n+\t\terr = errnoErr(e1)\n+\t}\n+\treturn\n+}\n+\n+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n+\n func read(fd int, p []byte) (n int, err error) {\n \tvar _p0 unsafe.Pointer\n \tif len(p) > 0 {\n"
};
},
computed: {
2019-03-13 17:24:40 +00:00
prettyHtml() {
2018-11-14 22:18:32 +00:00
return Diff2Html.getPrettyHtml(this.diffs, {
inputFormat: "diff",
showFiles: true,
matching: "lines",
outputFormat: "side-by-side"
});
}
}
};
< / script >
```
2016-08-23 16:24:43 +00:00
## API
2017-06-08 07:46:45 +00:00
> Intermediate Json From Git Word Diff Output
2014-08-30 22:33:12 +00:00
2017-06-14 11:02:04 +00:00
getJsonFromDiff(input: string, configuration?: Options): Result[]
2014-08-30 02:54:52 +00:00
2017-06-08 07:46:45 +00:00
> Pretty HTML diff
2014-08-30 22:33:12 +00:00
2016-08-23 16:24:43 +00:00
getPrettyHtml(input: any, configuration?: Options): string
2017-05-07 09:38:17 +00:00
> Check out the `typescript/diff2html.d.ts` for a complete API definition in TypeScript.
2014-08-30 22:33:12 +00:00
2016-08-23 17:20:54 +00:00
> Check out the `docs/demo.html` for a demo example.
2014-09-14 19:50:17 +00:00
2015-10-19 11:47:49 +00:00
## Configuration
The HTML output accepts a Javascript object with configuration. Possible options:
2014-09-14 19:50:17 +00:00
2015-10-19 11:47:49 +00:00
- `inputFormat` : the format of the input data: `'diff'` or `'json'` , default is `'diff'`
- `outputFormat` : the format of the output data: `'line-by-line'` or `'side-by-side'` , default is `'line-by-line'`
- `showFiles` : show a file list before the diff: `true` or `false` , default is `false`
2015-12-09 22:17:26 +00:00
- `matching` : matching level: `'lines'` for matching lines, `'words'` for matching lines and words or `'none'` , default is `none`
2015-11-25 16:37:26 +00:00
- `matchWordsThreshold` : similarity threshold for word matching, default is 0.25
2016-04-14 11:01:25 +00:00
- `matchingMaxComparisons` : perform at most this much comparisons for line matching a block of changes, default is `2500`
2017-10-16 21:00:03 +00:00
- `maxLineLengthHighlight` : only perform diff changes highlight if lines are smaller than this, default is `10000`
2016-10-15 12:21:22 +00:00
- `templates` : object with previously compiled templates to replace parts of the html
- `rawTemplates` : object with raw not compiled templates to replace parts of the html
2019-02-01 00:01:56 +00:00
- `renderNothingWhenEmpty` : render nothing if the diff shows no change in its comparison: `true` or `false` , default is `false`
2016-10-15 12:21:22 +00:00
> For more information regarding the possible templates look into [src/templates](https://github.com/rtfpessoa/diff2html/tree/master/src/templates)
2014-08-30 02:54:52 +00:00
2017-07-21 22:07:44 +00:00
** Diff2HtmlUI Helper Options **
- `synchronisedScroll` : scroll both panes in side-by-side mode: `true` or `false` , default is `false`
> For more information regarding the possible templates look into [src/templates](https://github.com/rtfpessoa/diff2html/tree/master/src/templates)
2016-02-07 14:19:23 +00:00
## Diff2HtmlUI Helper
> Simple wrapper to ease simple tasks in the browser such as: code highlight and js effects
2016-08-23 16:24:43 +00:00
* Invoke Diff2html
* Inject output in DOM element
* Enable collapsible file summary list
* Enable syntax highlight of the code in the diffs
2016-02-07 14:19:23 +00:00
### How to use
2016-08-23 16:24:43 +00:00
#### Mandatory HTML resource imports
2016-04-15 22:21:30 +00:00
```html
<!-- CSS -->
< link rel = "stylesheet" type = "text/css" href = "dist/diff2html.css" >
<!-- Javascripts -->
< script type = "text/javascript" src = "dist/diff2html.js" > < / script >
< script type = "text/javascript" src = "dist/diff2html-ui.js" > < / script >
```
2016-08-23 16:24:43 +00:00
#### Init
2016-02-07 14:19:23 +00:00
```js
var diff2htmlUi = new Diff2HtmlUI({diff: diffString});
// or
var diff2htmlUi = new Diff2HtmlUI({json: diffJson});
```
2016-08-23 16:24:43 +00:00
#### Draw
2016-02-07 14:19:23 +00:00
```js
diff2htmlUi.draw('html-target-elem', {inputFormat: 'json', showFiles: true, matching: 'lines'});
```
2016-08-23 16:24:43 +00:00
#### Syntax Highlight
2015-07-19 21:08:17 +00:00
> Add the dependencies.
2016-10-21 03:38:39 +00:00
Choose one color scheme, and add the main highlight code. Note that the stylesheet for the color scheme must come **before** the main diff2html stylesheet.
2015-07-19 21:08:17 +00:00
If your favourite language is not included in the default package also add its javascript highlight file.
```html
<!-- Stylesheet -->
2018-11-14 23:55:16 +00:00
< link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/styles/github.min.css" >
2016-10-21 03:38:39 +00:00
< link rel = "stylesheet" type = "text/css" href = "dist/diff2html.css" >
2016-02-07 14:19:23 +00:00
<!-- Javascripts -->
2016-04-25 18:41:00 +00:00
< script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.3/jquery.js" > < / script >
2018-11-14 23:55:16 +00:00
< script src = "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/highlight.min.js" > < / script >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/languages/scala.min.js" > < / script >
2016-02-07 14:19:23 +00:00
< script type = "text/javascript" src = "dist/diff2html-ui.js" > < / script >
```
2015-07-19 21:08:17 +00:00
2016-02-07 14:19:23 +00:00
> Invoke the Diff2HtmlUI helper
```js
$(document).ready(function() {
var diff2htmlUi = new Diff2HtmlUI({diff: lineDiffExample});
diff2htmlUi.draw('#line-by-line', {inputFormat: 'json', showFiles: true, matching: 'lines'});
diff2htmlUi.highlightCode('#line-by-line');
});
```
2016-08-23 16:24:43 +00:00
#### Collapsable File Summary List
2016-02-07 14:19:23 +00:00
> Add the dependencies.
```html
2015-07-19 21:08:17 +00:00
<!-- Javascripts -->
2016-04-25 18:41:00 +00:00
< script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.3/jquery.js" > < / script >
2016-02-07 14:19:23 +00:00
< script type = "text/javascript" src = "dist/diff2html-ui.js" > < / script >
2015-07-19 21:08:17 +00:00
```
2016-02-07 14:19:23 +00:00
> Invoke the Diff2HtmlUI helper
2015-07-19 21:08:17 +00:00
```js
2016-02-07 14:19:23 +00:00
$(document).ready(function() {
var diff2htmlUi = new Diff2HtmlUI({diff: lineDiffExample});
diff2htmlUi.draw('#line-by-line', {inputFormat: 'json', showFiles: true, matching: 'lines'});
diff2htmlUi.fileListCloseable('#line-by-line', false);
2015-07-19 21:08:17 +00:00
});
```
2016-12-01 16:56:22 +00:00
# Troubleshooting
### 1. Out of memory or Slow execution
#### Causes:
* Big files
* Big lines
#### Fix:
* Disable the line matching algorithm, by setting the option `{"matching": "none"}` when invoking diff2html
2014-08-30 22:33:12 +00:00
## Contributions
2014-08-30 02:54:52 +00:00
2015-12-23 20:19:10 +00:00
This is a developer friendly project, all the contributions are welcome.
To contribute just send a pull request with your changes following the guidelines described in `CONTRIBUTING.md` .
I will try to review them as soon as possible.
2014-08-30 02:54:52 +00:00
## License
2016-04-25 18:41:00 +00:00
Copyright 2014-2016 Rodrigo Fernandes. Released under the terms of the MIT license.
2014-08-30 02:54:52 +00:00
2014-08-30 22:33:12 +00:00
## Thanks
This project is inspired in [pretty-diff ](https://github.com/scottgonzalez/pretty-diff ) by [Scott González ](https://github.com/scottgonzalez ).
2014-08-30 02:54:52 +00:00
---