mirror of https://github.com/Wilfred/difftastic/
676 lines
17 KiB
HTML
676 lines
17 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>Difftastic, a structural diff</title>
|
|
<meta name="description" content="" />
|
|
|
|
<meta property="og:title" content="" />
|
|
<meta property="og:type" content="" />
|
|
<meta property="og:url" content="" />
|
|
<meta property="og:image" content="" />
|
|
|
|
<link rel="icon" href="/favicon.ico" sizes="any" />
|
|
<link rel="icon" href="/icon.svg" type="image/svg+xml" />
|
|
<link rel="apple-touch-icon" href="icon.png" />
|
|
<link
|
|
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
|
|
rel="stylesheet"
|
|
integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN"
|
|
crossorigin="anonymous"
|
|
/>
|
|
<link
|
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css"
|
|
rel="stylesheet"
|
|
/>
|
|
|
|
<link
|
|
rel="stylesheet"
|
|
href="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.15.1/devicon.min.css"
|
|
/>
|
|
<style>
|
|
body {
|
|
--bs-body-font-size: 18px;
|
|
}
|
|
|
|
html,
|
|
body,
|
|
.fw-bold,
|
|
h1,
|
|
h2,
|
|
h3,
|
|
h4,
|
|
h5,
|
|
h6 {
|
|
color: #f8f8f2 !important;
|
|
}
|
|
|
|
h1 {
|
|
font-family: "Fontdiner Swanky", serif;
|
|
text-shadow: 5px 5px #1d1b22;
|
|
}
|
|
|
|
.container h2 {
|
|
padding-bottom: 1.5rem;
|
|
}
|
|
|
|
html,
|
|
body {
|
|
background-color: #282a36;
|
|
}
|
|
|
|
object {
|
|
background-color: #f8f8f2;
|
|
border-radius: 25% 25%;
|
|
padding: 5px;
|
|
}
|
|
|
|
/* Colours from https://spec.draculatheme.com/#sec-Color-Palette */
|
|
.white {
|
|
color: #f8f8f2;
|
|
}
|
|
.red {
|
|
color: #ff5555;
|
|
}
|
|
.green {
|
|
color: #50fa7b;
|
|
}
|
|
.cyan {
|
|
color: #8be9fd;
|
|
}
|
|
|
|
a {
|
|
color: #50fa7b;
|
|
}
|
|
|
|
.btn {
|
|
box-shadow: 5px 5px #1d1b22;
|
|
}
|
|
|
|
img {
|
|
box-shadow: 10px 10px #1d1b22;
|
|
}
|
|
|
|
object {
|
|
box-shadow: 5px 5px #a09fa2;
|
|
}
|
|
|
|
img.screenshot {
|
|
box-shadow: none;
|
|
}
|
|
|
|
code {
|
|
color: #ff5555;
|
|
}
|
|
|
|
h3 {
|
|
line-height: 45px;
|
|
}
|
|
|
|
@media only screen and (min-width: 900px) {
|
|
.screenshot {
|
|
max-width: 800px;
|
|
}
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<!-- simple project description website, in the style of
|
|
https://popper.js.org/ or
|
|
https://cdnjs.com/libraries/font-awesome TODO: Prefer a dark
|
|
theme. It feels more like code, and less like vanilla
|
|
boostrap. -->
|
|
|
|
<!-- Use https://devicon.dev/ for PL icons. -->
|
|
|
|
<body>
|
|
<div class="px-4 pt-5 text-center">
|
|
<h1 class="display-4 text-body-emphasis">
|
|
<span class="red">diff</span><span class="green">tastic</span>
|
|
</h1>
|
|
<div class="col-lg-6 mx-auto">
|
|
<h2 class="fs-4">
|
|
a structural diff tool that understands syntax
|
|
</h2>
|
|
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center mb-5">
|
|
<a
|
|
href="https://github.com/Wilfred/difftastic"
|
|
class="fs-4 px-2 white"
|
|
>
|
|
GitHub
|
|
</a>
|
|
<a href="https://difftastic.wilfred.me.uk" class="fs-4 px-2 red">
|
|
Manual
|
|
</a>
|
|
<a
|
|
href="https://difftastic.wilfred.me.uk/installation.html"
|
|
class="fs-4 px-2 green"
|
|
>
|
|
Install
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="container col-xxl-8 px-4">
|
|
<div class="container px-4 pb-5">
|
|
<h2>
|
|
Focus On
|
|
<span class="green">What Changed</span>
|
|
</h2>
|
|
|
|
<!-- screenshot from difftastic commit e472acb8050e84c671470421f4fd5c74a9d3b2bd -->
|
|
<img src="add_wrap.png" class="img-fluid mb-4" alt="screenshot" />
|
|
<p>
|
|
Difftastic parses your code with tree-sitter. Unlike a line-oriented
|
|
text diff, difftastic understands that the inner expression hasn't
|
|
changed here.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="container px-4 pb-5">
|
|
<h2><span class="green">Ignore</span> Formatting Changes</h2>
|
|
|
|
<img src="reformat.png" class="img-fluid mb-4" alt="screenshot" />
|
|
<p>
|
|
Has your code formatter decided to split something over multiple
|
|
lines? Difftastic can show what has actually changed.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="container px-4 pb-5">
|
|
<h2><span class="green">Understand</span> Wrapping Changes</h2>
|
|
|
|
<img src="wrap_struct.png" class="img-fluid mb-4" alt="screenshot" />
|
|
<p>
|
|
Have you added a wrapper? Difftastic can match the delimiters exactly.
|
|
</p>
|
|
|
|
<img src="change_wrap.png" class="img-fluid mb-4" alt="screenshot" />
|
|
<p>
|
|
Even if you change the inner content, difftastic can still show you
|
|
the additional wrapper.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="container px-4 pb-5">
|
|
<h2>
|
|
<span class="green">Real</span>
|
|
Line Numbers
|
|
</h2>
|
|
|
|
<img src="line_numbers.png" class="img-fluid mb-4" alt="screenshot" />
|
|
<p>
|
|
Do you know how to read
|
|
<code>@@ -5,6 +5,7 @@</code> syntax? Difftastic shows the actual line
|
|
numbers from your files, both before and after.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="container px-4 pb-5">
|
|
<h2>Programming Languages</h2>
|
|
|
|
<div
|
|
class="row row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 g-4 pb-4"
|
|
>
|
|
<div class="col d-flex align-items-start">
|
|
<div class="foo">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="cplusplus.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
</div>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
C++
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="csharp.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
C#
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="clojure.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Clojure
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="lisp.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Common Lisp
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="dart.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Dart
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="erlang.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Erlang
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="go.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Go
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="haskell.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Haskell
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="java.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Java
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="javascript.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
JavaScript
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="kotlin.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Kotlin
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="lua.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Lua
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="ocaml.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
OCaml
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="php.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
PHP
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="python.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Python
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="r.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
R
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="ruby.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Ruby
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="rust.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Rust
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="scala.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
Scala
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="typescript.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
TypeScript
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- end languages -->
|
|
</div>
|
|
|
|
<p>
|
|
And more! See the full
|
|
<a href="https://difftastic.wilfred.me.uk/languages_supported.html"
|
|
>list of supported languages</a
|
|
>
|
|
in the manual.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="container px-4 pb-5">
|
|
<h2>File Formats</h2>
|
|
|
|
<div
|
|
class="row row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 g-4 pb-4"
|
|
>
|
|
<div class="col d-flex align-items-start">
|
|
<!-- https://www.svgrepo.com/svg/371192/curly-brackets -->
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="braces.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
HCL
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="html5.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
HTML
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="json.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
JSON
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col d-flex align-items-start">
|
|
<object
|
|
class="me-3"
|
|
width="45px"
|
|
height="45px"
|
|
data="yaml.svg"
|
|
type="image/svg+xml"
|
|
></object>
|
|
|
|
<div>
|
|
<h3 class="fw-bold mb-0 fs-4">
|
|
YAML
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
<!-- end formats -->
|
|
</div>
|
|
|
|
<p>
|
|
See the full
|
|
<a
|
|
href="https://difftastic.wilfred.me.uk/languages_supported.html#structured-text-formats"
|
|
>list of supported file formats</a
|
|
>
|
|
in the manual.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="container px-4 pb-5">
|
|
<h2>Works With <span class="green">Git</span></h2>
|
|
<img src="git_difftool.png" class="img-fluid mb-4" alt="screenshot" />
|
|
<p>
|
|
See the
|
|
<a href="https://difftastic.wilfred.me.uk/git.html"
|
|
>git configuration instructions</a
|
|
>
|
|
in the manual.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="container px-4 pb-5">
|
|
<h2>Fully <span class="green">Open Source</span></h2>
|
|
<p>
|
|
Difftastic is
|
|
<a href="https://github.com/Wilfred/difftastic/blob/master/LICENSE"
|
|
>MIT licensed</a
|
|
>. Download it, modify it, share it with your friends!
|
|
</p>
|
|
</div>
|
|
|
|
<div class="container px-4">
|
|
<p>
|
|
<em
|
|
>Made with Emacs and coffee by
|
|
<a href="https://github.com/wilfred/">Wilfred Hughes</a>.</em
|
|
>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<link
|
|
rel="stylesheet"
|
|
href="https://fonts.googleapis.com/css?family=Fontdiner+Swanky"
|
|
/>
|
|
|
|
<script
|
|
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"
|
|
integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL"
|
|
crossorigin="anonymous"
|
|
></script>
|
|
</body>
|
|
</html>
|