diff2html/README.md

448 lines
23 KiB
Markdown
Raw Normal View History

2015-12-24 11:27:07 +00:00
# diff2html
2014-08-30 02:54:52 +00:00
2019-10-13 18:21:19 +00:00
[![Codacy Quality Badge](https://api.codacy.com/project/badge/Grade/06412dc3f5a14f568778d0db8a1f7dc8)](https://www.codacy.com/app/rtfpessoa/diff2html?utm_source=github.com&utm_medium=referral&utm_content=rtfpessoa/diff2html&utm_campaign=Badge_Grade)
2018-08-09 09:20:37 +00:00
[![Codacy Coverage Badge](https://api.codacy.com/project/badge/Coverage/06412dc3f5a14f568778d0db8a1f7dc8)](https://www.codacy.com/app/rtfpessoa/diff2html?utm_source=github.com&utm_medium=referral&utm_content=rtfpessoa/diff2html&utm_campaign=Badge_Coverage)
2019-12-29 22:31:32 +00:00
[![GitHub CI](https://github.com/rtfpessoa/diff2html/workflows/CI/badge.svg?branch=master)](https://github.com/rtfpessoa/diff2html/actions?query=branch%3Amaster)
2015-12-24 11:27:07 +00:00
[![npm](https://img.shields.io/npm/v/diff2html.svg)](https://www.npmjs.com/package/diff2html)
[![Dependency Status](https://david-dm.org/rtfpessoa/diff2html.svg)](https://david-dm.org/rtfpessoa/diff2html)
[![devDependency Status](https://david-dm.org/rtfpessoa/diff2html/dev-status.svg)](https://david-dm.org/rtfpessoa/diff2html#info=devDependencies)
2019-10-18 12:52:50 +00:00
[![cdnjs](https://img.shields.io/cdnjs/v/diff2html)](https://cdnjs.com/libraries/diff2html)
2015-12-24 11:27:07 +00:00
2019-12-29 22:31:32 +00:00
[![node](https://img.shields.io/node/v/diff2html.svg)]() [![npm](https://img.shields.io/npm/l/diff2html.svg)]()
2015-12-24 11:27:07 +00:00
[![npm](https://img.shields.io/npm/dm/diff2html.svg)](https://www.npmjs.com/package/diff2html)
2019-08-22 22:24:45 +00:00
[![All Contributors](https://img.shields.io/badge/all_contributors-22-orange.svg?style=flat-square)](#contributors-)
2015-12-24 11:27:07 +00:00
[![Gitter](https://badges.gitter.im/rtfpessoa/diff2html.svg)](https://gitter.im/rtfpessoa/diff2html?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
2019-12-29 22:31:32 +00:00
diff2html generates pretty HTML diffs from git diff or unified diff output.
2015-12-24 11:27:07 +00:00
[![NPM](https://nodei.co/npm/diff2html.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/diff2html/)
2014-08-30 02:54:52 +00:00
## Features
2019-10-13 18:21:19 +00:00
- Supports git and unified diffs
2016-05-06 22:19:12 +00:00
2019-10-13 18:21:19 +00:00
- Line by line and Side by side diff
2014-08-30 02:54:52 +00:00
2019-10-13 18:21:19 +00:00
- New and old line numbers
2014-08-30 02:54:52 +00:00
2019-10-13 18:21:19 +00:00
- Inserted and removed lines
2014-08-30 22:33:12 +00:00
2019-12-29 22:31:32 +00:00
- GitHub like visual style
2014-08-30 02:54:52 +00:00
2019-10-13 18:21:19 +00:00
- Code syntax highlight
2015-07-19 21:34:46 +00:00
2019-10-13 18:21:19 +00:00
- Line similarity matching
2019-10-13 18:21:19 +00:00
- Easy code selection
2016-05-01 19:52:25 +00:00
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
2019-10-13 18:21:19 +00:00
- [WebJar](http://www.webjars.org/)
2019-12-29 22:31:32 +00:00
- [Node Library](https://www.npmjs.org/package/diff2html)
- [NPM CLI](https://www.npmjs.org/package/diff2html-cli)
2019-10-13 18:21:19 +00:00
- Manually download and import:
2019-12-29 22:31:32 +00:00
- Browser / Bundle
- Parser and HTML Generator
- [bundles/js/diff2html.min.js](./bundles/js/diff2html.min.js) - includes the diff parser and html generator
- Wrapper and helper adding syntax highlight, synchronized scroll, and other nice features
- [bundles/js/diff2html-ui.min.js](./bundles/js/diff2html-ui.min.js) - includes the wrapper of diff2html with
highlight for all `highlight.js` supported languages
- [bundles/js/diff2html-ui-slim.min.js](./bundles/js/diff2html-ui-slim.min.js) - includes the wrapper of diff2html
with "the most common" `highlight.js` supported languages
- [bundles/js/diff2html-ui-base.min.js](./bundles/js/diff2html-ui-base.min.js) - includes the wrapper of diff2html
without including a `highlight.js` implementation. You can use it without syntax highlight or by passing your
own implementation with the languages you prefer
- NPM / Node.js library
- ES5
- [lib/diff2html.js](./lib/diff2html.js) - includes the diff parser and html generator
- [lib/ui/js/diff2html-ui.js](./lib/ui/js/diff2html-ui.js) - includes the wrapper of diff2html with highlight for
all `highlight.js` supported languages
- [lib/ui/js/diff2html-ui-slim.js](./lib/ui/js/diff2html-ui-slim.js) - includes the wrapper of diff2html with "the
most common" `highlight.js` supported languages
- [lib/ui/js/diff2html-ui-base.js](./lib/ui/js/diff2html-ui-base.js)
- ES6
- [lib-esm/diff2html.js](./lib-esm/diff2html.js) - includes the diff parser and html generator
- [lib/ui/js/diff2html-ui.js](./lib/ui/js/diff2html-ui.js) - includes the wrapper of diff2html with highlight for
all `highlight.js` supported languages
- [lib/ui/js/diff2html-ui-slim.js](./lib/ui/js/diff2html-ui-slim.js) - includes the wrapper of diff2html with "the
most common" `highlight.js` supported languages
- [lib/ui/js/diff2html-ui-base.js](./lib/ui/js/diff2html-ui-base.js) - includes the wrapper of diff2html without
including a `highlight.js` implementation. You can use it without syntax highlight or by passing your own
implementation with the languages you prefer
## Diff2Html Usage
2014-09-08 17:15:51 +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="bundles/css/diff2html.min.css" />
```
You can also refer to it from a CDN like [CDNJS](https://cdnjs.com/libraries/diff2html).
2019-12-29 22:31:32 +00:00
### Diff2Html API
> JSON representation of the diff
2020-01-01 20:04:54 +00:00
```ts
function parse(diffInput: string, configuration: Diff2HtmlConfig = {}): DiffFile[];
```
2019-12-29 22:31:32 +00:00
> Pretty HTML representation of the diff
2020-01-01 20:04:54 +00:00
```ts
function html(diffInput: string | DiffFile[], configuration: Diff2HtmlConfig = {}): string;
```
2019-12-29 22:31:32 +00:00
> Check out the [docs/demo.html](./docs/demo.html) for a demo example.
### Diff2Html Configuration
The HTML output accepts a Javascript object with configuration. Possible options:
- `outputFormat`: the format of the output data: `'line-by-line'` or `'side-by-side'`, default is `'line-by-line'`
- `drawFileList`: show a file list before the diff: `true` or `false`, default is `false`
- `diffStyle`: show differences level in each line: `word` or `char`, default is `word`
- `matching`: matching level: `'lines'` for matching lines, `'words'` for matching lines and words or `'none'`, default
is `none`
- `matchWordsThreshold`: similarity threshold for word matching, default is 0.25
- `matchingMaxComparisons`: perform at most this much comparisons for line matching a block of changes, default is
`2500`
- `maxLineSizeInBlockForComparison`: maximum number os characters of the bigger line in a block to apply comparison,
default is `200`
- `maxLineLengthHighlight`: only perform diff changes highlight if lines are smaller than this, default is `10000`
- `renderNothingWhenEmpty`: render nothing if the diff shows no change in its comparison: `true` or `false`, default is
`false`
- `compiledTemplates`: object with previously compiled templates to replace parts of the html
- `rawTemplates`: object with raw not compiled templates to replace parts of the html
> For more information regarding the possible templates look into
> [src/templates](https://github.com/rtfpessoa/diff2html/tree/master/src/templates)
### Diff2Html Browser
Import the stylesheet and the library code
```html
<!-- CSS -->
<link rel="stylesheet" type="text/css" href="bundles/css/diff2html.min.css" />
<!-- Javascripts -->
<script type="text/javascript" src="bundles/js/diff2html.min.js"></script>
```
It will now be available as a global variable named `Diff2Html`.
```js
2019-12-29 22:31:32 +00:00
document.addEventListener('DOMContentLoaded', () => {
var diffHtml = global.Diff2Html.html('<Unified Diff String>', {
2019-10-13 18:21:19 +00:00
drawFileList: true,
2019-12-29 22:31:32 +00:00
matching: 'lines',
outputFormat: 'side-by-side',
2019-10-13 18:21:19 +00:00
});
2019-12-29 22:31:32 +00:00
document.getElementById('destination-elem-id').innerHTML = diffHtml;
2019-10-13 18:21:19 +00:00
});
```
2019-12-29 22:31:32 +00:00
### Diff2Html NPM / Node.js Library
```js
2019-12-29 22:31:32 +00:00
const Diff2html = require('diff2html');
const diffJson = Diff2html.parse('<Unified Diff String>');
2019-10-13 18:21:19 +00:00
const diffHtml = Diff2html.html(diffJson, { drawFileList: true });
2019-12-29 22:31:32 +00:00
document.getElementById('destination-elem-id').innerHTML = diffHtml;
```
2019-12-29 22:31:32 +00:00
### Diff2Html Examples
#### Diff2Html Angular Example
2017-10-23 02:54:53 +00:00
2019-10-13 18:21:19 +00:00
- Typescript
2017-10-23 02:54:53 +00:00
```typescript
2019-12-29 22:31:32 +00:00
import * as Diff2Html from 'diff2html';
import { Component, OnInit } from '@angular/core';
2017-10-23 02:54:53 +00:00
export class AppDiffComponent implements OnInit {
outputHtml: string;
constructor() {
this.init();
}
2019-10-13 18:21:19 +00:00
ngOnInit() {}
2017-10-23 02:54:53 +00:00
init() {
2019-10-13 18:21:19 +00:00
let strInput =
2019-12-29 22:31:32 +00:00
'--- 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.html(strInput, { drawFileList: true, matching: 'lines' });
2017-10-23 02:54:53 +00:00
this.outputHtml = outputHtml;
}
}
```
2019-10-13 18:21:19 +00:00
- HTML
2017-10-23 02:54:53 +00:00
```html
<!DOCTYPE html>
<html>
<head>
<title>diff2html</title>
</head>
<body>
<div [innerHtml]="outputHtml"></div>
</body>
</html>
```
2019-10-13 18:21:19 +00:00
- `.angular-cli.json` - Add styles
2017-10-23 02:54:53 +00:00
```json
"styles": [
"diff2html.min.css"
]
```
2019-12-29 22:31:32 +00:00
#### Diff2Html Vue.js Example
2018-11-14 22:18:32 +00:00
```vue
<template>
2019-10-13 18:21:19 +00:00
<div v-html="prettyHtml" />
2018-11-14 22:18:32 +00:00
</template>
<script>
2019-12-29 22:31:32 +00:00
import * as Diff2Html from 'diff2html';
import 'diff2html/bundles/css/diff2html.min.css';
2018-11-14 22:18:32 +00:00
export default {
2019-03-13 17:24:40 +00:00
data() {
2018-11-14 22:18:32 +00:00
return {
2019-10-13 18:21:19 +00:00
diffs:
2019-12-29 22:31:32 +00:00
'--- 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',
2018-11-14 22:18:32 +00:00
};
},
computed: {
2019-03-13 17:24:40 +00:00
prettyHtml() {
2019-12-29 22:31:32 +00:00
return Diff2Html.html(this.diffs, {
2019-10-13 18:21:19 +00:00
drawFileList: true,
2019-12-29 22:31:32 +00:00
matching: 'lines',
outputFormat: 'side-by-side',
2019-10-13 18:21:19 +00:00
});
2019-12-29 22:31:32 +00:00
},
},
2018-11-14 22:18:32 +00:00
};
</script>
```
2019-12-29 22:31:32 +00:00
## Diff2HtmlUI
2014-08-30 02:54:52 +00:00
2019-12-29 22:31:32 +00:00
> Simple wrapper to ease simple tasks in the browser such as: code highlight and js effects
2014-08-30 22:33:12 +00:00
2019-12-29 22:31:32 +00:00
- Invoke Diff2html
- Inject output in DOM element
- Enable collapsible file summary list
- Enable syntax highlight of the code in the diffs
2019-12-29 22:31:32 +00:00
### Diff2HtmlUI API
2014-09-14 19:50:17 +00:00
2019-12-29 22:31:32 +00:00
> Create a Diff2HtmlUI instance
2019-10-13 18:21:19 +00:00
2019-12-29 22:31:32 +00:00
```ts
constructor(target: HTMLElement, diffInput?: string | DiffFile[]) // diff2html-ui, diff2html-ui-slim
constructor(target: HTMLElement, diffInput?: string | DiffFile[], config: Diff2HtmlUIConfig = {}, hljs?: HighlightJS) // diff2html-ui-base
2019-12-29 22:31:32 +00:00
```
2014-09-14 19:50:17 +00:00
2019-12-29 22:31:32 +00:00
> Generate and inject in the document the Pretty HTML representation of the diff
2014-08-30 02:54:52 +00:00
2019-12-29 22:31:32 +00:00
```ts
draw(): void
```
2017-07-21 22:07:44 +00:00
2019-12-29 22:31:32 +00:00
> Enable extra features
2017-07-21 22:07:44 +00:00
2019-12-29 22:31:32 +00:00
```ts
synchronisedScroll(): void
fileListToggle(startVisible: boolean): void
highlightCode(): void
smartSelection(): void
2019-12-29 22:31:32 +00:00
```
2017-07-21 22:07:44 +00:00
2019-12-29 22:31:32 +00:00
> Check out the [docs/demo.html](./docs/demo.html) for a demo example.
2019-12-29 22:31:32 +00:00
### Diff2HtmlUI Configuration
2019-12-29 22:31:32 +00:00
- `synchronisedScroll`: scroll both panes in side-by-side mode: `true` or `false`, default is `true`
- `highlight`: syntax highlight the code on the diff: `true` or `false`, default is `true`
- `fileListToggle`: allow the file summary list to be toggled: `true` or `false`, default is `true`
- `fileListStartVisible`: choose if the file summary list starts visible: `true` or `false`, default is `false`
- `smartSelection`: allow selection of the code without including line numbers of line prefixes: `true` or `false`,
default is `true`
> NOTE: All the options from Diff2Html are also valid configurations in Diff2HtmlUI
2019-12-29 22:31:32 +00:00
### Diff2HtmlUI Browser
#### Mandatory HTML resource imports
```html
<!-- CSS -->
<link rel="stylesheet" type="text/css" href="bundles/css/diff2html.min.css" />
<!-- Javascripts -->
<script type="text/javascript" src="bundles/js/diff2html-ui.min.js"></script>
```
#### Init
```js
2019-12-29 22:31:32 +00:00
const targetElement = document.getElementById('destination-elem-id');
const configuration = { drawFileList: true, matching: 'lines' };
2019-10-13 18:21:19 +00:00
const diff2htmlUi = new Diff2HtmlUI(targetElement, diffString, configuration);
// or
const diff2htmlUi = new Diff2HtmlUI(targetElement, diffJson, configuration);
```
#### Draw
```js
2019-10-13 18:21:19 +00:00
diff2htmlUi.draw();
```
#### Syntax Highlight
```html
<!-- Stylesheet -->
2019-10-13 18:21:19 +00:00
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/styles/github.min.css" />
<link rel="stylesheet" type="text/css" href="bundles/css/diff2html.min.css" />
<!-- Javascripts -->
<script type="text/javascript" src="bundles/js/diff2html-ui.min.js"></script>
```
2019-10-13 18:21:19 +00:00
> Pass the option `highlight` with value true or invoke `diff2htmlUi.highlightCode()` after `diff2htmlUi.draw()`.
```js
2019-12-29 22:31:32 +00:00
document.addEventListener('DOMContentLoaded', () => {
2019-10-13 18:21:19 +00:00
const diffString = `diff --git a/sample.js b/sample.js
index 0000001..0ddf2ba
--- a/sample.js
+++ b/sample.js
@@ -1 +1 @@
-console.log("Hello World!")
+console.log("Hello from Diff2Html!")`;
2019-12-29 22:31:32 +00:00
const targetElement = document.getElementById('myDiffElement');
const configuration = { inputFormat: 'json', drawFileList: true, matching: 'lines', highlight: true };
const diff2htmlUi = new Diff2HtmlUI(targetElement, diffString, configuration);
2019-10-13 18:21:19 +00:00
diff2htmlUi.draw();
diff2htmlUi.highlightCode();
});
```
#### Collapsable File Summary List
> Add the dependencies.
```html
<!-- Javascripts -->
<script type="text/javascript" src="bundles/js/diff2html-ui.min.js"></script>
```
2019-12-29 22:31:32 +00:00
> Invoke the Diff2HtmlUI helper Pass the option `fileListToggle` with value true or invoke
> `diff2htmlUi.fileListToggle()` after `diff2htmlUi.draw()`.
```js
2019-12-29 22:31:32 +00:00
document.addEventListener('DOMContentLoaded', () => {
const targetElement = document.getElementById('myDiffElement');
var diff2htmlUi = new Diff2HtmlUI(targetElement, lineDiffExample, { drawFileList: true, matching: 'lines' });
2019-10-13 18:21:19 +00:00
diff2htmlUi.draw();
diff2htmlUi.fileListToggle(false);
});
```
2019-12-29 22:31:32 +00:00
## Troubleshooting
### 1. Out of memory or Slow execution
#### Causes:
2019-10-13 18:21:19 +00:00
- Big files
- Big lines
#### Fix:
2019-10-13 18:21:19 +00:00
- 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
2019-12-29 22:31:32 +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
2019-08-22 22:24:45 +00:00
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://rtfpessoa.xyz"><img src="https://avatars0.githubusercontent.com/u/902384?v=4" width="100px;" alt=""/><br /><sub><b>Rodrigo Fernandes</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=rtfpessoa" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/stockmind"><img src="https://avatars3.githubusercontent.com/u/5653847?v=4" width="100px;" alt=""/><br /><sub><b>stockmind</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=stockmind" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/lantian"><img src="https://avatars3.githubusercontent.com/u/535545?v=4" width="100px;" alt=""/><br /><sub><b>Ivan Vorontsov</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=lantian" title="Code">💻</a></td>
<td align="center"><a href="http://www.nick-brewer.com"><img src="https://avatars1.githubusercontent.com/u/129300?v=4" width="100px;" alt=""/><br /><sub><b>Nick Brewer</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=brewern" title="Code">💻</a></td>
<td align="center"><a href="http://heyitsmattwade.com"><img src="https://avatars0.githubusercontent.com/u/8504000?v=4" width="100px;" alt=""/><br /><sub><b>Matt Wade</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Aromellem" title="Bug reports">🐛</a></td>
<td align="center"><a href="http://mrfyda.github.io"><img src="https://avatars1.githubusercontent.com/u/593860?v=4" width="100px;" alt=""/><br /><sub><b>Rafael Cortês</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=mrfyda" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/nmatpt"><img src="https://avatars2.githubusercontent.com/u/5034733?v=4" width="100px;" alt=""/><br /><sub><b>Nuno Teixeira</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=nmatpt" title="Code">💻</a></td>
2019-08-22 22:24:45 +00:00
</tr>
<tr>
<td align="center"><a href="https://saino.me/"><img src="https://avatars0.githubusercontent.com/u/1567423?v=4" width="100px;" alt=""/><br /><sub><b>Koki Oyatsu</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Akaishuu0123" title="Bug reports">🐛</a></td>
<td align="center"><a href="http://www.jamesmonger.com"><img src="https://avatars2.githubusercontent.com/u/2037007?v=4" width="100px;" alt=""/><br /><sub><b>James Monger</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=Jameskmonger" title="Documentation">📖</a></td>
<td align="center"><a href="http://wesssel.github.io/"><img src="https://avatars2.githubusercontent.com/u/7767299?v=4" width="100px;" alt=""/><br /><sub><b>Wessel van der Pal</b></sub></a><br /><a href="#security-wesssel" title="Security">🛡️</a></td>
<td align="center"><a href="https://jung-kim.github.io"><img src="https://avatars2.githubusercontent.com/u/5281068?v=4" width="100px;" alt=""/><br /><sub><b>jk-kim</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=jung-kim" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/sss0791"><img src="https://avatars1.githubusercontent.com/u/1446970?v=4" width="100px;" alt=""/><br /><sub><b>Sergey Semenov</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Asss0791" title="Bug reports">🐛</a></td>
<td align="center"><a href="http://researcher.watson.ibm.com/researcher/view.php?person=us-nickm"><img src="https://avatars3.githubusercontent.com/u/4741620?v=4" width="100px;" alt=""/><br /><sub><b>Nick Mitchell</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Astarpit" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/samiraguiar"><img src="https://avatars0.githubusercontent.com/u/13439135?v=4" width="100px;" alt=""/><br /><sub><b>Samir Aguiar</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=samiraguiar" title="Documentation">📖</a></td>
2019-08-22 22:24:45 +00:00
</tr>
<tr>
<td align="center"><a href="https://twitter.com/pubkeypubkey"><img src="https://avatars3.githubusercontent.com/u/8926560?v=4" width="100px;" alt=""/><br /><sub><b>pubkey</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=pubkey" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/iliyaZelenko"><img src="https://avatars1.githubusercontent.com/u/13103045?v=4" width="100px;" alt=""/><br /><sub><b>Илья</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=iliyaZelenko" title="Documentation">📖</a></td>
<td align="center"><a href="https://akr.am"><img src="https://avatars0.githubusercontent.com/u/1823771?v=4" width="100px;" alt=""/><br /><sub><b>Mohamed Akram</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Amohd-akram" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/emarcotte"><img src="https://avatars0.githubusercontent.com/u/249390?v=4" width="100px;" alt=""/><br /><sub><b>Eugene Marcotte</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=emarcotte" title="Code">💻</a></td>
<td align="center"><a href="http://twitter.com/dimasabanin"><img src="https://avatars0.githubusercontent.com/u/8316?v=4" width="100px;" alt=""/><br /><sub><b>Dima Sabanin</b></sub></a><br /><a href="#maintenance-dsabanin" title="Maintenance">🚧</a></td>
<td align="center"><a href="https://github.com/benabbottnz"><img src="https://avatars2.githubusercontent.com/u/2616473?v=4" width="100px;" alt=""/><br /><sub><b>Ben Abbott</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=benabbottnz" title="Documentation">📖</a></td>
<td align="center"><a href="http://webminer.js.org"><img src="https://avatars1.githubusercontent.com/u/2196373?v=4" width="100px;" alt=""/><br /><sub><b>弘树@阿里</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Adickeylth" title="Bug reports">🐛</a></td>
2019-08-22 22:24:45 +00:00
</tr>
<tr>
<td align="center"><a href="https://github.com/Rantanen"><img src="https://avatars0.githubusercontent.com/u/385385?v=4" width="100px;" alt=""/><br /><sub><b>Mikko Rantanen</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3ARantanen" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/extend1994"><img src="https://avatars2.githubusercontent.com/u/13430892?v=4" width="100px;" alt=""/><br /><sub><b>Ann</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=extend1994" title="Documentation">📖</a></td>
<td align="center"><a href="https://github.com/escitalopram"><img src="https://avatars0.githubusercontent.com/u/1155220?v=4" width="100px;" alt=""/><br /><sub><b>escitalopram</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Aescitalopram" title="Bug reports">🐛</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=escitalopram" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/apps/dependabot"><img src="https://avatars0.githubusercontent.com/in/29110?v=4" width="100px;" alt=""/><br /><sub><b>dependabot[bot]</b></sub></a><br /><a href="#security-dependabot[bot]" title="Security">🛡️</a> <a href="#maintenance-dependabot[bot]" title="Maintenance">🚧</a></td>
2019-08-22 22:24:45 +00:00
</tr>
</table>
<!-- markdownlint-enable -->
<!-- prettier-ignore-end -->
2019-10-13 18:21:19 +00:00
2019-08-22 22:24:45 +00:00
<!-- ALL-CONTRIBUTORS-LIST:END -->
2019-12-29 22:31:32 +00:00
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification.
Contributions of any kind welcome!
2019-08-22 22:24:45 +00:00
2014-08-30 02:54:52 +00:00
## License
2019-12-29 22:31:32 +00:00
Copyright 2014-present 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
2019-12-29 22:31:32 +00:00
This project is inspired in [pretty-diff](https://github.com/scottgonzalez/pretty-diff) by
[Scott González](https://github.com/scottgonzalez).
2014-08-30 22:33:12 +00:00
2014-08-30 02:54:52 +00:00
---