Compare commits
87 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1350740c98 | ||
|
|
04640cccbe | ||
|
|
babcdb0405 | ||
|
|
2f4f41a31d | ||
|
|
2f8c477f66 | ||
|
|
064659a70e | ||
|
|
eef651f0d4 | ||
|
|
d67d80eb41 | ||
|
|
a88e4b3ba4 | ||
|
|
dbdd2e9c26 | ||
|
|
05fbd33a3a | ||
|
|
b2e31b6083 | ||
|
|
00a12d11aa | ||
|
|
b517e40e5c | ||
|
|
dea1d300b3 | ||
|
|
4de87bf099 | ||
|
|
aa4731953e | ||
|
|
363b619d87 | ||
|
|
7005ced0b5 | ||
|
|
99b7757a3a | ||
|
|
dd4b774958 | ||
|
|
b04a400329 | ||
|
|
7410d25ee4 | ||
|
|
987d8cb65c | ||
|
|
d425892b61 | ||
|
|
f7aacc4fc0 | ||
|
|
0de1e040b0 | ||
|
|
4b42e4b0de | ||
|
|
863246eed0 | ||
|
|
3865a5f27e | ||
|
|
b26353c04d | ||
|
|
8d9a8a8265 | ||
|
|
1aa822da56 | ||
|
|
786e5cc027 | ||
|
|
9806d677f3 | ||
|
|
efd28ffb3a | ||
|
|
93103e2c49 | ||
|
|
0029890ead | ||
|
|
79268800ff | ||
|
|
9f8d6bd4ca | ||
|
|
669ee2bff8 | ||
|
|
0dccfa26a5 | ||
|
|
c244b0dd51 | ||
|
|
4e6bb49788 | ||
|
|
14989f1ddd | ||
|
|
58c088977e | ||
|
|
c22febdbd6 | ||
|
|
1b0c1a87a2 | ||
|
|
84a323f0de | ||
|
|
0b76161d86 | ||
|
|
6ed6a5da88 | ||
|
|
47000723a9 | ||
|
|
6b420de752 | ||
|
|
bd4a84cd3e | ||
|
|
1aafcb201b | ||
|
|
4d2505dac8 | ||
|
|
ff3a86d393 | ||
|
|
5dae945e95 | ||
|
|
8102d3cf61 | ||
|
|
2ffca85422 | ||
|
|
299f7800c3 | ||
|
|
66912a3a54 | ||
|
|
3732d59249 | ||
|
|
412928fc59 | ||
|
|
61695e2896 | ||
|
|
93d0fbc6c3 | ||
|
|
61d90c1c41 | ||
|
|
f6f05db2f6 | ||
|
|
41a901694d | ||
|
|
3516684c68 | ||
|
|
638a4a286f | ||
|
|
9d805bb021 | ||
|
|
8d34de633a | ||
|
|
409b5e2f6b | ||
|
|
657d48aac0 | ||
|
|
611957e270 | ||
|
|
dfe2eec8df | ||
|
|
40a9c0bdc8 | ||
|
|
a2d34e195c | ||
|
|
e46184baa2 | ||
|
|
7a3a4398d1 | ||
|
|
2c7e03d266 | ||
|
|
c76b24a1fd | ||
|
|
68515376a1 | ||
|
|
551a0b407f | ||
|
|
32239a0b9d | ||
|
|
0d314aecd1 |
44 changed files with 19773 additions and 7994 deletions
58
.eslintrc.js
58
.eslintrc.js
|
|
@ -1,58 +0,0 @@
|
||||||
module.exports = {
|
|
||||||
parser: '@typescript-eslint/parser',
|
|
||||||
parserOptions: {
|
|
||||||
ecmaVersion: 2018,
|
|
||||||
sourceType: 'module',
|
|
||||||
},
|
|
||||||
env: {
|
|
||||||
browser: true,
|
|
||||||
es6: true,
|
|
||||||
node: true,
|
|
||||||
},
|
|
||||||
globals: {
|
|
||||||
Atomics: 'readonly',
|
|
||||||
SharedArrayBuffer: 'readonly',
|
|
||||||
document: 'readonly',
|
|
||||||
navigator: 'readonly',
|
|
||||||
window: 'readonly',
|
|
||||||
},
|
|
||||||
extends: [
|
|
||||||
'eslint:recommended',
|
|
||||||
'plugin:@typescript-eslint/eslint-recommended',
|
|
||||||
'plugin:@typescript-eslint/recommended',
|
|
||||||
'plugin:json/recommended',
|
|
||||||
'plugin:promise/recommended',
|
|
||||||
'plugin:import/errors',
|
|
||||||
'plugin:import/warnings',
|
|
||||||
'plugin:import/typescript',
|
|
||||||
'plugin:node/recommended',
|
|
||||||
'plugin:sonarjs/recommended',
|
|
||||||
'plugin:jest/recommended',
|
|
||||||
'plugin:jest/style',
|
|
||||||
'prettier',
|
|
||||||
],
|
|
||||||
plugins: ['@typescript-eslint', 'json', 'promise', 'import', 'node', 'sonarjs', 'jest', 'optimize-regex'],
|
|
||||||
rules: {
|
|
||||||
// Enable
|
|
||||||
'optimize-regex/optimize-regex': 'error',
|
|
||||||
// Hack: For some reason we need pass again the extensions
|
|
||||||
'node/no-missing-import': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
tryExtensions: ['.js', '.jsx', '.ts', '.tsx', '.json'],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
// Disable
|
|
||||||
// https://github.com/benmosher/eslint-plugin-import/issues/1446
|
|
||||||
'import/named': 'off',
|
|
||||||
// We don't need this since we are using transpilation
|
|
||||||
'node/no-unsupported-features/es-syntax': 'off',
|
|
||||||
'no-process-exit': 'off',
|
|
||||||
// Too verbose
|
|
||||||
'sonarjs/no-duplicate-string': 'off',
|
|
||||||
// Too verbose
|
|
||||||
'sonarjs/cognitive-complexity': 'off',
|
|
||||||
// Too verbose
|
|
||||||
'sonarjs/no-nested-template-literals': 'off',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
|
|
@ -19,7 +19,7 @@ jobs:
|
||||||
environment: 'production'
|
environment: 'production'
|
||||||
steps:
|
steps:
|
||||||
- name: Download docs
|
- name: Download docs
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: docs
|
name: docs
|
||||||
path: docs/
|
path: docs/
|
||||||
|
|
|
||||||
98
.github/workflows/test-and-publish.yml
vendored
98
.github/workflows/test-and-publish.yml
vendored
|
|
@ -25,7 +25,7 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
export NEXT_VERSION="$(/bin/git-version --folder=$PWD --release-branch=master)"
|
export NEXT_VERSION="$(/bin/git-version --folder=$PWD --release-branch=master)"
|
||||||
echo "Next version is ${NEXT_VERSION}"
|
echo "Next version is ${NEXT_VERSION}"
|
||||||
echo "${NEXT_VERSION}" > .version
|
echo "${NEXT_VERSION}" > next-version.txt
|
||||||
echo "version=${NEXT_VERSION}" >> $GITHUB_ENV
|
echo "version=${NEXT_VERSION}" >> $GITHUB_ENV
|
||||||
- name: Get next npm tag name
|
- name: Get next npm tag name
|
||||||
run: |
|
run: |
|
||||||
|
|
@ -37,22 +37,22 @@ jobs:
|
||||||
export PUBLISH_TAG="pr"
|
export PUBLISH_TAG="pr"
|
||||||
fi
|
fi
|
||||||
echo "Next tag is ${PUBLISH_TAG}"
|
echo "Next tag is ${PUBLISH_TAG}"
|
||||||
echo "${PUBLISH_TAG}" > .tag
|
echo "${PUBLISH_TAG}" > publish-tag.txt
|
||||||
- name: Upload versions
|
- name: Upload versions
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: versions
|
name: versions
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
path: |
|
path: |
|
||||||
.version
|
next-version.txt
|
||||||
.tag
|
publish-tag.txt
|
||||||
|
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [version]
|
needs: [version]
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [16.x, 18.x]
|
node-version: [16.x, 18.x, 20.x, 22.x]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
|
|
@ -61,17 +61,17 @@ jobs:
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'yarn'
|
cache: 'npm'
|
||||||
- name: Log environment setup
|
- name: Log environment setup
|
||||||
run: |
|
run: |
|
||||||
node -v
|
node -v
|
||||||
yarn -v
|
npm -v
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn install --ignore-engines
|
run: npm install
|
||||||
- name: Build templates
|
- name: Build templates
|
||||||
run: yarn run build:templates
|
run: npm run build:templates
|
||||||
- name: Build library
|
- name: Build library
|
||||||
run: yarn run build
|
run: npm run build
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
@ -82,74 +82,66 @@ jobs:
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Download versions
|
- name: Download versions
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: versions
|
name: versions
|
||||||
- name: Store version
|
- name: Store version
|
||||||
run: echo "version=$(cat .version)" >> $GITHUB_ENV
|
run: echo "version=$(cat next-version.txt)" >> $GITHUB_ENV
|
||||||
- name: Configure Git
|
- name: Configure Git
|
||||||
run: |
|
run: |
|
||||||
git config user.email "gh-actions@users.noreply.github.com"
|
git config user.email "gh-actions@users.noreply.github.com"
|
||||||
git config user.name "GitHub Actions"
|
git config user.name "GitHub Actions"
|
||||||
- name: Tag commit
|
- name: Tag commit
|
||||||
uses: tvdias/github-tagger@v0.0.1
|
uses: tvdias/github-tagger@v0.0.1
|
||||||
with:
|
with:
|
||||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
repo-token: '${{ secrets.GITHUB_TOKEN }}'
|
||||||
tag: "${{ env.version }}"
|
tag: '${{ env.version }}'
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn
|
run: npm install
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
node-version: '18.x'
|
node-version: '22.x'
|
||||||
- name: Configure Yarn version
|
- name: Configure NPM version
|
||||||
env:
|
env:
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
rm -f .npmrc
|
rm -f .npmrc
|
||||||
touch .npmrc
|
touch .npmrc
|
||||||
echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" >> .npmrc
|
echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" >> .npmrc
|
||||||
echo "registry=https://registry.npmjs.org/" >> .npmrc
|
echo "registry=https://registry.npmjs.org/" >> .npmrc
|
||||||
echo "access=public" >> .npmrc
|
echo "access=public" >> .npmrc
|
||||||
echo "save-exact=true" >> .npmrc
|
echo "save-exact=true" >> .npmrc
|
||||||
yarn config set version-tag-prefix ""
|
|
||||||
yarn config set version-git-message "Release version %s"
|
|
||||||
- name: Version package
|
- name: Version package
|
||||||
run: |
|
run: |
|
||||||
# Update version in packages to publish
|
# Update version in packages to publish
|
||||||
yarn version --non-interactive --new-version $(cat .version)
|
npm version $(cat next-version.txt) -m "Release version %s"
|
||||||
- name: Publish to NPM
|
- name: Publish to NPM
|
||||||
run: yarn publish --tag $(cat .tag) --non-interactive --new-version $(cat .version)
|
run: npm publish --tag $(cat publish-tag.txt)
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: '18.x'
|
node-version: '22.x'
|
||||||
registry-url: 'https://npm.pkg.github.com'
|
registry-url: 'https://npm.pkg.github.com'
|
||||||
- name: Configure Yarn version
|
- name: Configure NPM version
|
||||||
env:
|
env:
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
rm -f .npmrc
|
rm -f .npmrc
|
||||||
touch .npmrc
|
touch .npmrc
|
||||||
echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}" >> .npmrc
|
echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}" >> .npmrc
|
||||||
echo "@rtfpessoa:registry=https://npm.pkg.github.com/" >> .npmrc
|
echo "@rtfpessoa:registry=https://npm.pkg.github.com/" >> .npmrc
|
||||||
echo "access=public" >> .npmrc
|
echo "access=public" >> .npmrc
|
||||||
echo "save-exact=true" >> .npmrc
|
echo "save-exact=true" >> .npmrc
|
||||||
yarn config set version-tag-prefix ""
|
|
||||||
yarn config set version-git-message "Release version %s"
|
|
||||||
- name: Version package
|
|
||||||
run: |
|
|
||||||
# Update version in packages to publish
|
|
||||||
yarn version --non-interactive --new-version $(cat .version)
|
|
||||||
- name: Publish to GPR
|
- name: Publish to GPR
|
||||||
run: |
|
run: |
|
||||||
# HACK: Override npm package name to be able to publish in GitHub
|
# HACK: Override npm package name to be able to publish in GitHub
|
||||||
sed -i 's/^ "name":.*/ "name": "@rtfpessoa\/diff2html",/g' package.json
|
sed -i 's/^ "name":.*/ "name": "@rtfpessoa\/diff2html",/g' package.json
|
||||||
echo "Going to publish version $(cat .version) to GitHub"
|
echo "Going to publish version $(cat next-version.txt) to GitHub"
|
||||||
yarn publish --tag $(cat .tag) --non-interactive --new-version $(cat .version)
|
npm publish --tag $(cat publish-tag.txt)
|
||||||
# HACK: Restore npm package name
|
# HACK: Restore npm package name
|
||||||
sed -i 's/^ "name":.*/ "name": "diff2html",/g' package.json
|
sed -i 's/^ "name":.*/ "name": "diff2html",/g' package.json
|
||||||
- name: Upload docs
|
- name: Upload docs
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: docs
|
name: docs
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
|
||||||
11
.gitignore
vendored
11
.gitignore
vendored
|
|
@ -29,9 +29,18 @@ bower_components/
|
||||||
# Terraform
|
# Terraform
|
||||||
/terraform/.terraform
|
/terraform/.terraform
|
||||||
|
|
||||||
/_target/
|
# Compiled templates
|
||||||
/src/diff2html-templates.*
|
/src/diff2html-templates.*
|
||||||
|
|
||||||
|
# Compiled website
|
||||||
/docs/
|
/docs/
|
||||||
|
|
||||||
|
# Bundles temporary typescript files compiled by webpack
|
||||||
|
/bundles-out/
|
||||||
|
|
||||||
|
# Web bundles
|
||||||
/bundles/
|
/bundles/
|
||||||
|
# CommonJS library
|
||||||
/lib/
|
/lib/
|
||||||
|
# ESNext library
|
||||||
/lib-esm/
|
/lib-esm/
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
. "$(dirname "$0")/_/husky.sh"
|
|
||||||
|
|
||||||
npx lint-staged
|
npm run lint:staged
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,9 @@
|
||||||
|
|
||||||
- Before sending a pull request make sure your code is tested.
|
- Before sending a pull request make sure your code is tested.
|
||||||
|
|
||||||
- Before sending a pull request for a feature, be sure to run tests with `yarn test`.
|
- Before sending a pull request for a feature, be sure to run tests with `npm run test`.
|
||||||
|
|
||||||
- Use the same coding style as the rest of the codebase, most of the check can be performed with `yarn run lint`.
|
- Use the same coding style as the rest of the codebase, most of the check can be performed with `npm run run lint`.
|
||||||
|
|
||||||
- Use `git rebase` (not `git merge`) to sync your work from time to time with the master branch.
|
- Use `git rebase` (not `git merge`) to sync your work from time to time with the master branch.
|
||||||
|
|
||||||
|
|
|
||||||
50
README.md
50
README.md
|
|
@ -1,23 +1,20 @@
|
||||||
# diff2html
|
# diff2html
|
||||||
|
|
||||||
[](https://www.codacy.com/app/rtfpessoa/diff2html?utm_source=github.com&utm_medium=referral&utm_content=rtfpessoa/diff2html&utm_campaign=Badge_Grade)
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
[](https://www.codacy.com/app/rtfpessoa/diff2html?utm_source=github.com&utm_medium=referral&utm_content=rtfpessoa/diff2html&utm_campaign=Badge_Coverage)
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
[](https://circleci.com/gh/rtfpessoa/diff2html)
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
|
[](https://github.com/rtfpessoa/diff2html/actions/workflows/release.yml)
|
||||||
|
|
||||||
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
|
|
||||||
[](https://www.npmjs.com/package/diff2html)
|
|
||||||
[](https://david-dm.org/rtfpessoa/diff2html)
|
|
||||||
[](https://david-dm.org/rtfpessoa/diff2html#info=devDependencies)
|
|
||||||
[](https://www.jsdelivr.com/package/npm/diff2html)
|
[](https://www.jsdelivr.com/package/npm/diff2html)
|
||||||
|
[](#contributors)
|
||||||
[]() []()
|
|
||||||
[](https://www.npmjs.com/package/diff2html)
|
|
||||||
[](#contributors)
|
|
||||||
[](https://gitter.im/rtfpessoa/diff2html?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
|
||||||
|
|
||||||
diff2html generates pretty HTML diffs from git diff or unified diff output.
|
diff2html generates pretty HTML diffs from git diff or unified diff output.
|
||||||
|
|
||||||
[](https://nodei.co/npm/diff2html/)
|
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
|
|
||||||
<!-- toc -->
|
<!-- toc -->
|
||||||
|
|
@ -204,7 +201,7 @@ diff2htmlUi.draw();
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!-- Stylesheet -->
|
<!-- Stylesheet -->
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/styles/github.min.css" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css" />
|
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css" />
|
||||||
|
|
||||||
<!-- Javascripts -->
|
<!-- Javascripts -->
|
||||||
|
|
@ -230,6 +227,21 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
When using the `auto` color scheme, you will need to specify both the light and dark themes for highlight.js to use.
|
||||||
|
|
||||||
|
```html
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css"
|
||||||
|
media="screen and (prefers-color-scheme: light)"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css"
|
||||||
|
media="screen and (prefers-color-scheme: dark)"
|
||||||
|
/>
|
||||||
|
```
|
||||||
|
|
||||||
#### Collapsable File Summary List
|
#### Collapsable File Summary List
|
||||||
|
|
||||||
> Add the dependencies.
|
> Add the dependencies.
|
||||||
|
|
@ -256,7 +268,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||||
#### Example with plain HTML+CSS+JS
|
#### Example with plain HTML+CSS+JS
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html lang="en-us">
|
<html lang="en-us">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
|
|
@ -309,7 +321,7 @@ import { Controller } from '@hotwired/stimulus';
|
||||||
|
|
||||||
import { Diff2HtmlUI, Diff2HtmlUIConfig } from 'diff2html/lib/ui/js/diff2html-ui-slim.js';
|
import { Diff2HtmlUI, Diff2HtmlUIConfig } from 'diff2html/lib/ui/js/diff2html-ui-slim.js';
|
||||||
|
|
||||||
// Requires `yarn add highlight.js`
|
// Requires `npm install highlight.js`
|
||||||
import 'highlight.js/styles/github.css';
|
import 'highlight.js/styles/github.css';
|
||||||
import 'diff2html/bundles/css/diff2html.min.css';
|
import 'diff2html/bundles/css/diff2html.min.css';
|
||||||
|
|
||||||
|
|
@ -378,7 +390,7 @@ The HTML output accepts a Javascript object with configuration. Possible options
|
||||||
`false`
|
`false`
|
||||||
- `matchingMaxComparisons`: perform at most this much comparisons for line matching a block of changes, default is
|
- `matchingMaxComparisons`: perform at most this much comparisons for line matching a block of changes, default is
|
||||||
`2500`
|
`2500`
|
||||||
- `maxLineSizeInBlockForComparison`: maximum number os characters of the bigger line in a block to apply comparison,
|
- `maxLineSizeInBlockForComparison`: maximum number of characters of the bigger line in a block to apply comparison,
|
||||||
default is `200`
|
default is `200`
|
||||||
- `compiledTemplates`: object ([Hogan.js](https://github.com/twitter/hogan.js/) template values) with previously
|
- `compiledTemplates`: object ([Hogan.js](https://github.com/twitter/hogan.js/) template values) with previously
|
||||||
compiled templates to replace parts of the html, default is `{}`. For example:
|
compiled templates to replace parts of the html, default is `{}`. For example:
|
||||||
|
|
@ -389,6 +401,8 @@ The HTML output accepts a Javascript object with configuration. Possible options
|
||||||
> [src/templates](https://github.com/rtfpessoa/diff2html/tree/master/src/templates)
|
> [src/templates](https://github.com/rtfpessoa/diff2html/tree/master/src/templates)
|
||||||
- `highlightLanguages`: Map of extension to language name, used for highlighting. This overrides the default language
|
- `highlightLanguages`: Map of extension to language name, used for highlighting. This overrides the default language
|
||||||
detection based on file extensions.
|
detection based on file extensions.
|
||||||
|
- `colorScheme`: color scheme to use for the diff, default is `light`. Possible values are `light`, `dark`, and `auto`
|
||||||
|
which will use the browser's preferred color scheme.
|
||||||
|
|
||||||
### Diff2Html Browser
|
### Diff2Html Browser
|
||||||
|
|
||||||
|
|
@ -456,7 +470,7 @@ export class AppDiffComponent implements OnInit {
|
||||||
- HTML
|
- HTML
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>diff2html</title>
|
<title>diff2html</title>
|
||||||
|
|
|
||||||
77
eslint.config.mjs
Normal file
77
eslint.config.mjs
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
import globals from 'globals';
|
||||||
|
import eslint from '@eslint/js';
|
||||||
|
import tseslint from 'typescript-eslint';
|
||||||
|
import pluginJest from 'eslint-plugin-jest';
|
||||||
|
import json from '@eslint/json';
|
||||||
|
import pluginPromise from 'eslint-plugin-promise';
|
||||||
|
|
||||||
|
export default [
|
||||||
|
{ ...eslint.configs.recommended, files: ['src/**/*.{js,mjs,cjs,ts}'] },
|
||||||
|
...tseslint.configs.recommended,
|
||||||
|
// ...tseslint.configs.recommendedTypeChecked,
|
||||||
|
// ...tseslint.configs.strict,
|
||||||
|
// ...tseslint.configs.stylistic,
|
||||||
|
// ...tseslint.configs.strictTypeChecked,
|
||||||
|
// ...tseslint.configs.stylisticTypeChecked,
|
||||||
|
{
|
||||||
|
rules: {
|
||||||
|
'@typescript-eslint/no-unused-vars': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
args: 'all',
|
||||||
|
argsIgnorePattern: '^_',
|
||||||
|
caughtErrors: 'all',
|
||||||
|
caughtErrorsIgnorePattern: '^_',
|
||||||
|
destructuredArrayIgnorePattern: '^_',
|
||||||
|
varsIgnorePattern: '^_',
|
||||||
|
ignoreRestSiblings: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
pluginPromise.configs['flat/recommended'],
|
||||||
|
{
|
||||||
|
plugins: {
|
||||||
|
json,
|
||||||
|
},
|
||||||
|
files: ['**/*.json'],
|
||||||
|
language: 'json/json',
|
||||||
|
rules: {
|
||||||
|
'json/no-duplicate-keys': 'error',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
...pluginJest.configs['flat/recommended'],
|
||||||
|
...pluginJest.configs['flat/style'],
|
||||||
|
files: ['src/__tests__/**/*tests.ts'],
|
||||||
|
plugins: { jest: pluginJest },
|
||||||
|
languageOptions: {
|
||||||
|
globals: pluginJest.environments.globals.globals,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
languageOptions: {
|
||||||
|
globals: {
|
||||||
|
...globals.browser,
|
||||||
|
...globals.node,
|
||||||
|
...globals.es2025,
|
||||||
|
Atomics: 'readonly',
|
||||||
|
SharedArrayBuffer: 'readonly',
|
||||||
|
document: 'readonly',
|
||||||
|
navigator: 'readonly',
|
||||||
|
window: 'readonly',
|
||||||
|
},
|
||||||
|
parserOptions: {
|
||||||
|
project: './tsconfig.eslint.json',
|
||||||
|
tsconfigRootDir: './',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ignores: ['src/diff2html-templates.*', 'coverage/', 'docs/', 'bundles-out/', 'bundles/', 'lib/', 'lib-esm/'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
...tseslint.configs.disableTypeChecked,
|
||||||
|
files: ['**/*.{js,mjs,cjs}'],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
@ -19,4 +19,5 @@ module.exports = {
|
||||||
lines: 93,
|
lines: 93,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
prettierPath: require.resolve('prettier-2'),
|
||||||
};
|
};
|
||||||
|
|
|
||||||
18121
package-lock.json
generated
Normal file
18121
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
128
package.json
128
package.json
|
|
@ -35,35 +35,35 @@
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"eslint": "eslint --ignore-path .gitignore \"**/*.{js,jsx,ts,tsx,json}\"",
|
"lint:staged": "lint-staged",
|
||||||
"lint:check": "yarn run eslint",
|
"lint:check": "eslint",
|
||||||
"lint:fix": "yarn run eslint --fix",
|
"lint:fix": "eslint --fix",
|
||||||
"prettier": "prettier --ignore-path .gitignore '**/*.+(js|jsx|ts|tsx|json|css|html|md|mdx)'",
|
"prettier": "prettier --ignore-path .gitignore '**/*.+(js|jsx|ts|tsx|json|css|html|md|mdx)'",
|
||||||
"format:check": "yarn run prettier --check",
|
"format:check": "npm run prettier --check",
|
||||||
"format:fix": "yarn run prettier --write",
|
"format:fix": "npm run prettier --write",
|
||||||
"build": "yarn run build:css && yarn run build:templates && yarn run build:es5 && yarn run build:esm && yarn run build:bundles && yarn run build:website",
|
"build": "npm run build:css && npm run build:templates && npm run build:commonjs && npm run build:esm && npm run build:bundles && npm run build:website",
|
||||||
"build:es5": "rm -rf lib; tsc -p tsconfig.json --outDir lib",
|
"build:commonjs": "rm -rf lib; tsc -p tsconfig.json -m CommonJS --outDir lib",
|
||||||
"build:esm": "rm -rf lib-esm; tsc -p tsconfig.json -m es6 --outDir lib-esm",
|
"build:esm": "rm -rf lib-esm; tsc -p tsconfig.json -m ESNext --outDir lib-esm",
|
||||||
"build:bundles": "rm -rf ./bundles/js; webpack --mode production --config webpack.bundles.ts",
|
"build:bundles": "rm -rf ./bundles/js; webpack --mode production --config webpack.bundles.ts",
|
||||||
"build:css": "rm -rf ./bundles/css; postcss --config ./postcss.config.js --no-map -o ./bundles/css/diff2html.min.css ./src/ui/css/diff2html.css",
|
"build:css": "rm -rf ./bundles/css; postcss --config ./postcss.config.js --no-map -o ./bundles/css/diff2html.min.css ./src/ui/css/diff2html.css",
|
||||||
"build:templates": "ts-node ./scripts/hulk.ts --wrapper ts --variable 'defaultTemplates' ./src/templates/*.mustache > ./src/diff2html-templates.ts",
|
"build:templates": "ts-node ./scripts/hulk.ts --wrapper ts --variable 'defaultTemplates' ./src/templates/*.mustache > ./src/diff2html-templates.ts",
|
||||||
"build:website": "rm -rf docs; webpack --mode production --config webpack.website.ts",
|
"build:website": "rm -rf docs; webpack --mode production --config webpack.website.ts",
|
||||||
"gen": "yarn run gen:toc",
|
"gen": "npm run gen:toc",
|
||||||
"gen:toc-base": "markdown-toc --maxdepth 3 --bullets='-' -i",
|
"gen:toc-base": "markdown-toc --maxdepth 3 --bullets='-' -i",
|
||||||
"gen:toc": "yarn run gen:toc-base README.md",
|
"gen:toc": "npm run gen:toc-base README.md",
|
||||||
"test": "is-ci 'test:coverage' 'test:watch'",
|
"test": "is-ci 'test:coverage' 'test:watch'",
|
||||||
"test:coverage": "jest --coverage",
|
"test:coverage": "jest --coverage",
|
||||||
"test:watch": "jest --watch",
|
"test:watch": "jest --watch",
|
||||||
"test:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand --watch",
|
"test:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand --watch",
|
||||||
"coverage:open": "yarn run test:coverage && open ./coverage/index.html",
|
"coverage:open": "npm run test:coverage && open ./coverage/index.html",
|
||||||
"coverage:push": "curl -Ls https://coverage.codacy.com/get.sh | bash",
|
"coverage:push": "curl -Ls https://coverage.codacy.com/get.sh | bash",
|
||||||
"validate": "yarn run build:templates && yarn run format:check && yarn run lint:check && yarn run build && yarn run test:coverage",
|
"validate": "npm run build:templates && npm run format:check && npm run lint:check && npm run build && npm run test:coverage",
|
||||||
"fix": "yarn run format:fix && yarn run lint:fix",
|
"fix": "npm run format:fix && npm run lint:fix",
|
||||||
"start": "yarn run start:website",
|
"start": "npm run start:website",
|
||||||
"start:website": "webpack-dev-server --mode development --config webpack.website.ts",
|
"start:website": "webpack serve --mode development --config webpack.website.ts",
|
||||||
"preversion": "yarn run validate",
|
"preversion": "npm run validate",
|
||||||
"version": "git add -A package.json",
|
"version": "git add -A package.json",
|
||||||
"prepare": "husky install"
|
"prepare": "husky"
|
||||||
},
|
},
|
||||||
"main": "./lib/diff2html.js",
|
"main": "./lib/diff2html.js",
|
||||||
"module": "./lib-esm/diff2html.js",
|
"module": "./lib-esm/diff2html.js",
|
||||||
|
|
@ -77,68 +77,65 @@
|
||||||
"prettier --write"
|
"prettier --write"
|
||||||
],
|
],
|
||||||
"README.md": [
|
"README.md": [
|
||||||
"yarn run gen:toc-base"
|
"npm run gen:toc-base"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"diff": "5.1.0",
|
"diff": "^7.0.0",
|
||||||
"hogan.js": "3.0.2"
|
"hogan.js": "3.0.2"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"highlight.js": "11.6.0"
|
"highlight.js": "11.9.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/diff": "5.0.2",
|
"prettier-2": "npm:prettier@^2",
|
||||||
"@types/hogan.js": "3.0.1",
|
"@eslint/js": "^9.17.0",
|
||||||
"@types/jest": "29.2.0",
|
"@eslint/json": "^0.9.0",
|
||||||
"@types/mkdirp": "1.0.2",
|
"@types/diff": "^6.0.0",
|
||||||
"@types/node": "18.11.3",
|
"@types/hogan.js": "3.0.5",
|
||||||
"@types/nopt": "3.0.29",
|
"@types/jest": "^29.5.14",
|
||||||
"@typescript-eslint/eslint-plugin": "5.40.1",
|
"@types/node": "^22.10.2",
|
||||||
"@typescript-eslint/parser": "5.40.1",
|
"@types/nopt": "3.0.32",
|
||||||
"all-contributors-cli": "^6.24.0",
|
"all-contributors-cli": "^6.24.0",
|
||||||
"autoprefixer": "10.4.12",
|
"autoprefixer": "^10.4.20",
|
||||||
"bulma": "^0.9.4",
|
"bulma": "^1.0.2",
|
||||||
"clipboard": "2.0.11",
|
"clipboard": "2.0.11",
|
||||||
"copy-webpack-plugin": "11.0.0",
|
"copy-webpack-plugin": "^12.0.2",
|
||||||
"css-loader": "6.7.1",
|
"css-loader": "^7.1.2",
|
||||||
"cssnano": "5.1.13",
|
"cssnano": "^7.0.6",
|
||||||
"eslint": "8.26.0",
|
"eslint": "^9.17.0",
|
||||||
"eslint-config-prettier": "8.5.0",
|
"eslint-plugin-jest": "28.10.0",
|
||||||
"eslint-plugin-import": "2.26.0",
|
"eslint-plugin-promise": "^7.2.1",
|
||||||
"eslint-plugin-jest": "27.1.3",
|
|
||||||
"eslint-plugin-json": "3.1.0",
|
|
||||||
"eslint-plugin-node": "11.1.0",
|
|
||||||
"eslint-plugin-optimize-regex": "1.2.1",
|
|
||||||
"eslint-plugin-promise": "6.1.1",
|
|
||||||
"eslint-plugin-sonarjs": "0.16.0",
|
|
||||||
"file-loader": "6.2.0",
|
"file-loader": "6.2.0",
|
||||||
"handlebars": "4.7.7",
|
"globals": "^15.14.0",
|
||||||
"handlebars-loader": "1.7.2",
|
"handlebars": "4.7.8",
|
||||||
"html-webpack-plugin": "5.5.0",
|
"handlebars-loader": "1.7.3",
|
||||||
"husky": "^8.0.1",
|
"html-webpack-plugin": "^5.6.3",
|
||||||
|
"husky": "^9.1.7",
|
||||||
"image-webpack-loader": "8.1.0",
|
"image-webpack-loader": "8.1.0",
|
||||||
"is-ci-cli": "2.2.0",
|
"is-ci-cli": "2.2.0",
|
||||||
"jest": "29.2.1",
|
"jest": "29.7.0",
|
||||||
"lint-staged": "13.0.3",
|
"lint-staged": "^15.2.11",
|
||||||
"markdown-toc": "^1.2.0",
|
"markdown-toc": "^1.2.0",
|
||||||
"mini-css-extract-plugin": "2.6.1",
|
"mini-css-extract-plugin": "^2.9.2",
|
||||||
"mkdirp": "1.0.4",
|
"mkdirp": "3.0.1",
|
||||||
"nopt": "6.0.0",
|
"nopt": "^8.0.0",
|
||||||
"postcss": "8.4.18",
|
"postcss": "^8.4.49",
|
||||||
"postcss-cli": "10.0.0",
|
"postcss-cli": "11.0.0",
|
||||||
"postcss-import": "15.0.0",
|
"postcss-import": "^16.1.0",
|
||||||
"postcss-loader": "7.0.1",
|
"postcss-loader": "^8.1.1",
|
||||||
"postcss-preset-env": "7.8.2",
|
"postcss-preset-env": "^10.1.2",
|
||||||
"prettier": "2.7.1",
|
"prettier": "^3.4.2",
|
||||||
"ts-jest": "29.0.3",
|
"ts-jest": "^29.2.5",
|
||||||
"ts-loader": "9.4.1",
|
"ts-loader": "9.5.1",
|
||||||
"ts-node": "10.9.1",
|
"ts-node": "10.9.2",
|
||||||
"typescript": "4.8.4",
|
"typescript": "^5.7.2",
|
||||||
|
"typescript-eslint": "^8.18.2",
|
||||||
"url-loader": "4.1.1",
|
"url-loader": "4.1.1",
|
||||||
"webpack": "5.74.0",
|
"webpack": "^5.97.1",
|
||||||
"webpack-cli": "4.10.0",
|
"webpack-cli": "^6.0.1",
|
||||||
"whatwg-fetch": "3.6.2"
|
"webpack-dev-server": "^5.2.0",
|
||||||
|
"whatwg-fetch": "3.6.20"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"lodash": ">=4.17.20",
|
"lodash": ">=4.17.20",
|
||||||
|
|
@ -151,7 +148,8 @@
|
||||||
"trim-newlines": ">=3.0.1",
|
"trim-newlines": ">=3.0.1",
|
||||||
"async": ">=2.6.4",
|
"async": ">=2.6.4",
|
||||||
"terser": ">=5.14.2",
|
"terser": ">=5.14.2",
|
||||||
"semver-regex": ">=4.0.5"
|
"semver-regex": ">=4.0.5",
|
||||||
|
"http-cache-semantics": ">=4.1.1"
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"files": [
|
"files": [
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ function extractFiles(files: string[]): string[] {
|
||||||
`;
|
`;
|
||||||
|
|
||||||
if (options.version) {
|
if (options.version) {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||||
console.log(require('../package.json').version);
|
console.log(require('../package.json').version);
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ import { parse } from '../diff-parser';
|
||||||
|
|
||||||
describe('DiffParser', () => {
|
describe('DiffParser', () => {
|
||||||
describe('generateDiffJson', () => {
|
describe('generateDiffJson', () => {
|
||||||
// eslint-disable-next-line jest/expect-expect
|
|
||||||
it('should parse unix with \n diff', () => {
|
it('should parse unix with \n diff', () => {
|
||||||
const diff =
|
const diff =
|
||||||
'diff --git a/sample b/sample\n' +
|
'diff --git a/sample b/sample\n' +
|
||||||
|
|
@ -52,7 +51,6 @@ describe('DiffParser', () => {
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
// eslint-disable-next-line jest/expect-expect
|
|
||||||
it('should parse windows with \r\n diff', () => {
|
it('should parse windows with \r\n diff', () => {
|
||||||
const diff =
|
const diff =
|
||||||
'diff --git a/sample b/sample\r\n' +
|
'diff --git a/sample b/sample\r\n' +
|
||||||
|
|
@ -102,7 +100,6 @@ describe('DiffParser', () => {
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
// eslint-disable-next-line jest/expect-expect
|
|
||||||
it('should parse old os x with \r diff', () => {
|
it('should parse old os x with \r diff', () => {
|
||||||
const diff =
|
const diff =
|
||||||
'diff --git a/sample b/sample\r' +
|
'diff --git a/sample b/sample\r' +
|
||||||
|
|
@ -152,7 +149,6 @@ describe('DiffParser', () => {
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
// eslint-disable-next-line jest/expect-expect
|
|
||||||
it('should parse mixed eols diff', () => {
|
it('should parse mixed eols diff', () => {
|
||||||
const diff =
|
const diff =
|
||||||
'diff --git a/sample b/sample\n' +
|
'diff --git a/sample b/sample\n' +
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
|
|
||||||
import { parse, html } from '../diff2html';
|
import { parse, html } from '../diff2html';
|
||||||
import { DiffFile, LineType, OutputFormatType } from '../types';
|
import { ColorSchemeType, DiffFile, LineType, OutputFormatType } from '../types';
|
||||||
|
|
||||||
const diffExample1 =
|
const diffExample1 =
|
||||||
'diff --git a/sample b/sample\n' +
|
'diff --git a/sample b/sample\n' +
|
||||||
|
|
@ -49,7 +49,7 @@ const jsonExample1: DiffFile[] = [
|
||||||
];
|
];
|
||||||
|
|
||||||
describe('Diff2Html', () => {
|
describe('Diff2Html', () => {
|
||||||
describe('getJsonFromDiff', () => {
|
describe('parse', () => {
|
||||||
it('should parse simple diff to json', () => {
|
it('should parse simple diff to json', () => {
|
||||||
const diff =
|
const diff =
|
||||||
'diff --git a/sample b/sample\n' +
|
'diff --git a/sample b/sample\n' +
|
||||||
|
|
@ -199,11 +199,13 @@ describe('Diff2Html', () => {
|
||||||
]
|
]
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('html', () => {
|
||||||
it('should generate pretty line by line html from diff', () => {
|
it('should generate pretty line by line html from diff', () => {
|
||||||
const result = html(diffExample1, { drawFileList: false });
|
const result = html(diffExample1, { drawFileList: false });
|
||||||
expect(result).toMatchInlineSnapshot(`
|
expect(result).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-wrapper">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -260,7 +262,7 @@ describe('Diff2Html', () => {
|
||||||
it('should generate pretty line by line html from json', () => {
|
it('should generate pretty line by line html from json', () => {
|
||||||
const result = html(jsonExample1, { drawFileList: false });
|
const result = html(jsonExample1, { drawFileList: false });
|
||||||
expect(result).toMatchInlineSnapshot(`
|
expect(result).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-wrapper">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -317,7 +319,7 @@ describe('Diff2Html', () => {
|
||||||
it('should generate pretty diff with files summary', () => {
|
it('should generate pretty diff with files summary', () => {
|
||||||
const result = html(diffExample1, { drawFileList: true });
|
const result = html(diffExample1, { drawFileList: true });
|
||||||
expect(result).toMatchInlineSnapshot(`
|
expect(result).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-file-list-wrapper">
|
"<div class="d2h-file-list-wrapper d2h-light-color-scheme">
|
||||||
<div class="d2h-file-list-header">
|
<div class="d2h-file-list-header">
|
||||||
<span class="d2h-file-list-title">Files changed (1)</span>
|
<span class="d2h-file-list-title">Files changed (1)</span>
|
||||||
<a class="d2h-file-switch d2h-hide">hide</a>
|
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||||
|
|
@ -337,7 +339,7 @@ describe('Diff2Html', () => {
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div><div class="d2h-wrapper">
|
</div><div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -394,7 +396,7 @@ describe('Diff2Html', () => {
|
||||||
it('should generate pretty side by side html from diff', () => {
|
it('should generate pretty side by side html from diff', () => {
|
||||||
const result = html(diffExample1, { outputFormat: OutputFormatType.SIDE_BY_SIDE, drawFileList: false });
|
const result = html(diffExample1, { outputFormat: OutputFormatType.SIDE_BY_SIDE, drawFileList: false });
|
||||||
expect(result).toMatchInlineSnapshot(`
|
expect(result).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-wrapper">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -465,7 +467,7 @@ describe('Diff2Html', () => {
|
||||||
it('should generate pretty side by side html from json', () => {
|
it('should generate pretty side by side html from json', () => {
|
||||||
const result = html(jsonExample1, { outputFormat: OutputFormatType.SIDE_BY_SIDE, drawFileList: false });
|
const result = html(jsonExample1, { outputFormat: OutputFormatType.SIDE_BY_SIDE, drawFileList: false });
|
||||||
expect(result).toMatchInlineSnapshot(`
|
expect(result).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-wrapper">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -536,7 +538,7 @@ describe('Diff2Html', () => {
|
||||||
it('should generate pretty side by side html from diff 2', () => {
|
it('should generate pretty side by side html from diff 2', () => {
|
||||||
const result = html(diffExample1, { outputFormat: OutputFormatType.SIDE_BY_SIDE, drawFileList: true });
|
const result = html(diffExample1, { outputFormat: OutputFormatType.SIDE_BY_SIDE, drawFileList: true });
|
||||||
expect(result).toMatchInlineSnapshot(`
|
expect(result).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-file-list-wrapper">
|
"<div class="d2h-file-list-wrapper d2h-light-color-scheme">
|
||||||
<div class="d2h-file-list-header">
|
<div class="d2h-file-list-header">
|
||||||
<span class="d2h-file-list-title">Files changed (1)</span>
|
<span class="d2h-file-list-title">Files changed (1)</span>
|
||||||
<a class="d2h-file-switch d2h-hide">hide</a>
|
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||||
|
|
@ -556,7 +558,7 @@ describe('Diff2Html', () => {
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div><div class="d2h-wrapper">
|
</div><div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -650,7 +652,7 @@ describe('Diff2Html', () => {
|
||||||
' \n';
|
' \n';
|
||||||
const result = html(diffExample2, { drawFileList: false });
|
const result = html(diffExample2, { drawFileList: false });
|
||||||
expect(result).toMatchInlineSnapshot(`
|
expect(result).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-wrapper">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-211439" class="d2h-file-wrapper" data-lang="md">
|
<div id="d2h-211439" class="d2h-file-wrapper" data-lang="md">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -876,7 +878,7 @@ describe('Diff2Html', () => {
|
||||||
|
|
||||||
const result = html(diff);
|
const result = html(diff);
|
||||||
expect(result).toMatchInlineSnapshot(`
|
expect(result).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-file-list-wrapper">
|
"<div class="d2h-file-list-wrapper d2h-light-color-scheme">
|
||||||
<div class="d2h-file-list-header">
|
<div class="d2h-file-list-header">
|
||||||
<span class="d2h-file-list-title">Files changed (1)</span>
|
<span class="d2h-file-list-title">Files changed (1)</span>
|
||||||
<a class="d2h-file-switch d2h-hide">hide</a>
|
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||||
|
|
@ -896,7 +898,7 @@ describe('Diff2Html', () => {
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div><div class="d2h-wrapper">
|
</div><div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-597266" class="d2h-file-wrapper" data-lang="html">
|
<div id="d2h-597266" class="d2h-file-wrapper" data-lang="html">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -926,7 +928,7 @@ describe('Diff2Html', () => {
|
||||||
<td class="d2h-del d2h-change">
|
<td class="d2h-del d2h-change">
|
||||||
<div class="d2h-code-line">
|
<div class="d2h-code-line">
|
||||||
<span class="d2h-code-line-prefix">-</span>
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
<span class="d2h-code-line-ctn"><del><!-- commented code --></del></span>
|
<span class="d2h-code-line-ctn"><<del>!-- commented code --</del>></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
|
@ -937,7 +939,7 @@ describe('Diff2Html', () => {
|
||||||
<td class="d2h-del d2h-change">
|
<td class="d2h-del d2h-change">
|
||||||
<div class="d2h-code-line">
|
<div class="d2h-code-line">
|
||||||
<span class="d2h-code-line-prefix">-</span>
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
<span class="d2h-code-line-ctn"><del></div</del>></span>
|
<span class="d2h-code-line-ctn"><<del>/div</del>></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
|
@ -948,7 +950,7 @@ describe('Diff2Html', () => {
|
||||||
<td class="d2h-ins d2h-change">
|
<td class="d2h-ins d2h-change">
|
||||||
<div class="d2h-code-line">
|
<div class="d2h-code-line">
|
||||||
<span class="d2h-code-line-prefix">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class="d2h-code-line-ctn"><ins><html></ins></span>
|
<span class="d2h-code-line-ctn"><<ins>html</ins>></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
|
@ -959,7 +961,7 @@ describe('Diff2Html', () => {
|
||||||
<td class="d2h-ins d2h-change">
|
<td class="d2h-ins d2h-change">
|
||||||
<div class="d2h-code-line">
|
<div class="d2h-code-line">
|
||||||
<span class="d2h-code-line-prefix">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class="d2h-code-line-ctn"><ins><body</ins>></span>
|
<span class="d2h-code-line-ctn"><<ins>body</ins>></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
@ -978,7 +980,7 @@ describe('Diff2Html', () => {
|
||||||
const result = html(diff);
|
const result = html(diff);
|
||||||
/* eslint-disable no-irregular-whitespace */
|
/* eslint-disable no-irregular-whitespace */
|
||||||
expect(result).toMatchInlineSnapshot(`
|
expect(result).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-file-list-wrapper">
|
"<div class="d2h-file-list-wrapper d2h-light-color-scheme">
|
||||||
<div class="d2h-file-list-header">
|
<div class="d2h-file-list-header">
|
||||||
<span class="d2h-file-list-title">Files changed (1)</span>
|
<span class="d2h-file-list-title">Files changed (1)</span>
|
||||||
<a class="d2h-file-switch d2h-hide">hide</a>
|
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||||
|
|
@ -998,7 +1000,7 @@ describe('Diff2Html', () => {
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div><div class="d2h-wrapper">
|
</div><div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-719103" class="d2h-file-wrapper" data-lang="js">
|
<div id="d2h-719103" class="d2h-file-wrapper" data-lang="js">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -1256,5 +1258,289 @@ describe('Diff2Html', () => {
|
||||||
`);
|
`);
|
||||||
/* eslint-enable no-irregular-whitespace */
|
/* eslint-enable no-irregular-whitespace */
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('with auto colorScheme', () => {
|
||||||
|
it('should return a html diff with auto color scheme', () => {
|
||||||
|
const result = html(diffExample1, {
|
||||||
|
drawFileList: false,
|
||||||
|
colorScheme: ColorSchemeType.AUTO,
|
||||||
|
});
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"<div class="d2h-wrapper d2h-auto-color-scheme">
|
||||||
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
||||||
|
<div class="d2h-file-header">
|
||||||
|
<span class="d2h-file-name-wrapper">
|
||||||
|
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
|
||||||
|
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
|
||||||
|
</svg> <span class="d2h-file-name">sample</span>
|
||||||
|
<span class="d2h-tag d2h-changed d2h-changed-tag">CHANGED</span></span>
|
||||||
|
<label class="d2h-file-collapse">
|
||||||
|
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||||||
|
Viewed
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="d2h-file-diff">
|
||||||
|
<div class="d2h-code-wrapper">
|
||||||
|
<table class="d2h-diff-table">
|
||||||
|
<tbody class="d2h-diff-tbody">
|
||||||
|
<tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-info"></td>
|
||||||
|
<td class="d2h-info">
|
||||||
|
<div class="d2h-code-line">@@ -1 +1 @@</div>
|
||||||
|
</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||||||
|
<div class="line-num1">1</div>
|
||||||
|
<div class="line-num2"></div>
|
||||||
|
</td>
|
||||||
|
<td class="d2h-del d2h-change">
|
||||||
|
<div class="d2h-code-line">
|
||||||
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
|
<span class="d2h-code-line-ctn"><del>test</del></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||||||
|
<div class="line-num1"></div>
|
||||||
|
<div class="line-num2">1</div>
|
||||||
|
</td>
|
||||||
|
<td class="d2h-ins d2h-change">
|
||||||
|
<div class="d2h-code-line">
|
||||||
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
|
<span class="d2h-code-line-ctn"><ins>test1</ins></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>"
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should include auto colorScheme on file list', () => {
|
||||||
|
const result = html(diffExample1, {
|
||||||
|
drawFileList: true,
|
||||||
|
colorScheme: ColorSchemeType.AUTO,
|
||||||
|
});
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"<div class="d2h-file-list-wrapper d2h-auto-color-scheme">
|
||||||
|
<div class="d2h-file-list-header">
|
||||||
|
<span class="d2h-file-list-title">Files changed (1)</span>
|
||||||
|
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||||
|
<a class="d2h-file-switch d2h-show">show</a>
|
||||||
|
</div>
|
||||||
|
<ol class="d2h-file-list">
|
||||||
|
<li class="d2h-file-list-line">
|
||||||
|
<span class="d2h-file-name-wrapper">
|
||||||
|
<svg aria-hidden="true" class="d2h-icon d2h-changed" height="16" title="modified" version="1.1"
|
||||||
|
viewBox="0 0 14 16" width="14">
|
||||||
|
<path d="M13 1H1C0.45 1 0 1.45 0 2v12c0 0.55 0.45 1 1 1h12c0.55 0 1-0.45 1-1V2c0-0.55-0.45-1-1-1z m0 13H1V2h12v12zM4 8c0-1.66 1.34-3 3-3s3 1.34 3 3-1.34 3-3 3-3-1.34-3-3z"></path>
|
||||||
|
</svg> <a href="#d2h-675094" class="d2h-file-name">sample</a>
|
||||||
|
<span class="d2h-file-stats">
|
||||||
|
<span class="d2h-lines-added">+1</span>
|
||||||
|
<span class="d2h-lines-deleted">-1</span>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div><div class="d2h-wrapper d2h-auto-color-scheme">
|
||||||
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
||||||
|
<div class="d2h-file-header">
|
||||||
|
<span class="d2h-file-name-wrapper">
|
||||||
|
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
|
||||||
|
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
|
||||||
|
</svg> <span class="d2h-file-name">sample</span>
|
||||||
|
<span class="d2h-tag d2h-changed d2h-changed-tag">CHANGED</span></span>
|
||||||
|
<label class="d2h-file-collapse">
|
||||||
|
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||||||
|
Viewed
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="d2h-file-diff">
|
||||||
|
<div class="d2h-code-wrapper">
|
||||||
|
<table class="d2h-diff-table">
|
||||||
|
<tbody class="d2h-diff-tbody">
|
||||||
|
<tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-info"></td>
|
||||||
|
<td class="d2h-info">
|
||||||
|
<div class="d2h-code-line">@@ -1 +1 @@</div>
|
||||||
|
</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||||||
|
<div class="line-num1">1</div>
|
||||||
|
<div class="line-num2"></div>
|
||||||
|
</td>
|
||||||
|
<td class="d2h-del d2h-change">
|
||||||
|
<div class="d2h-code-line">
|
||||||
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
|
<span class="d2h-code-line-ctn"><del>test</del></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||||||
|
<div class="line-num1"></div>
|
||||||
|
<div class="line-num2">1</div>
|
||||||
|
</td>
|
||||||
|
<td class="d2h-ins d2h-change">
|
||||||
|
<div class="d2h-code-line">
|
||||||
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
|
<span class="d2h-code-line-ctn"><ins>test1</ins></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>"
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('with dark colorScheme', () => {
|
||||||
|
it('should return a html diff with dark mode', () => {
|
||||||
|
const result = html(diffExample1, {
|
||||||
|
drawFileList: false,
|
||||||
|
colorScheme: ColorSchemeType.DARK,
|
||||||
|
});
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"<div class="d2h-wrapper d2h-dark-color-scheme">
|
||||||
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
||||||
|
<div class="d2h-file-header">
|
||||||
|
<span class="d2h-file-name-wrapper">
|
||||||
|
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
|
||||||
|
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
|
||||||
|
</svg> <span class="d2h-file-name">sample</span>
|
||||||
|
<span class="d2h-tag d2h-changed d2h-changed-tag">CHANGED</span></span>
|
||||||
|
<label class="d2h-file-collapse">
|
||||||
|
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||||||
|
Viewed
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="d2h-file-diff">
|
||||||
|
<div class="d2h-code-wrapper">
|
||||||
|
<table class="d2h-diff-table">
|
||||||
|
<tbody class="d2h-diff-tbody">
|
||||||
|
<tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-info"></td>
|
||||||
|
<td class="d2h-info">
|
||||||
|
<div class="d2h-code-line">@@ -1 +1 @@</div>
|
||||||
|
</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||||||
|
<div class="line-num1">1</div>
|
||||||
|
<div class="line-num2"></div>
|
||||||
|
</td>
|
||||||
|
<td class="d2h-del d2h-change">
|
||||||
|
<div class="d2h-code-line">
|
||||||
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
|
<span class="d2h-code-line-ctn"><del>test</del></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||||||
|
<div class="line-num1"></div>
|
||||||
|
<div class="line-num2">1</div>
|
||||||
|
</td>
|
||||||
|
<td class="d2h-ins d2h-change">
|
||||||
|
<div class="d2h-code-line">
|
||||||
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
|
<span class="d2h-code-line-ctn"><ins>test1</ins></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>"
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should include dark colorScheme on file list', () => {
|
||||||
|
const result = html(diffExample1, {
|
||||||
|
drawFileList: true,
|
||||||
|
colorScheme: ColorSchemeType.DARK,
|
||||||
|
});
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"<div class="d2h-file-list-wrapper d2h-dark-color-scheme">
|
||||||
|
<div class="d2h-file-list-header">
|
||||||
|
<span class="d2h-file-list-title">Files changed (1)</span>
|
||||||
|
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||||
|
<a class="d2h-file-switch d2h-show">show</a>
|
||||||
|
</div>
|
||||||
|
<ol class="d2h-file-list">
|
||||||
|
<li class="d2h-file-list-line">
|
||||||
|
<span class="d2h-file-name-wrapper">
|
||||||
|
<svg aria-hidden="true" class="d2h-icon d2h-changed" height="16" title="modified" version="1.1"
|
||||||
|
viewBox="0 0 14 16" width="14">
|
||||||
|
<path d="M13 1H1C0.45 1 0 1.45 0 2v12c0 0.55 0.45 1 1 1h12c0.55 0 1-0.45 1-1V2c0-0.55-0.45-1-1-1z m0 13H1V2h12v12zM4 8c0-1.66 1.34-3 3-3s3 1.34 3 3-1.34 3-3 3-3-1.34-3-3z"></path>
|
||||||
|
</svg> <a href="#d2h-675094" class="d2h-file-name">sample</a>
|
||||||
|
<span class="d2h-file-stats">
|
||||||
|
<span class="d2h-lines-added">+1</span>
|
||||||
|
<span class="d2h-lines-deleted">-1</span>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div><div class="d2h-wrapper d2h-dark-color-scheme">
|
||||||
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="">
|
||||||
|
<div class="d2h-file-header">
|
||||||
|
<span class="d2h-file-name-wrapper">
|
||||||
|
<svg aria-hidden="true" class="d2h-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12">
|
||||||
|
<path d="M6 5H2v-1h4v1zM2 8h7v-1H2v1z m0 2h7v-1H2v1z m0 2h7v-1H2v1z m10-7.5v9.5c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h7.5l3.5 3.5z m-1 0.5L8 2H1v12h10V5z"></path>
|
||||||
|
</svg> <span class="d2h-file-name">sample</span>
|
||||||
|
<span class="d2h-tag d2h-changed d2h-changed-tag">CHANGED</span></span>
|
||||||
|
<label class="d2h-file-collapse">
|
||||||
|
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||||||
|
Viewed
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="d2h-file-diff">
|
||||||
|
<div class="d2h-code-wrapper">
|
||||||
|
<table class="d2h-diff-table">
|
||||||
|
<tbody class="d2h-diff-tbody">
|
||||||
|
<tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-info"></td>
|
||||||
|
<td class="d2h-info">
|
||||||
|
<div class="d2h-code-line">@@ -1 +1 @@</div>
|
||||||
|
</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||||||
|
<div class="line-num1">1</div>
|
||||||
|
<div class="line-num2"></div>
|
||||||
|
</td>
|
||||||
|
<td class="d2h-del d2h-change">
|
||||||
|
<div class="d2h-code-line">
|
||||||
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
|
<span class="d2h-code-line-ctn"><del>test</del></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr><tr>
|
||||||
|
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||||||
|
<div class="line-num1"></div>
|
||||||
|
<div class="line-num2">1</div>
|
||||||
|
</td>
|
||||||
|
<td class="d2h-ins d2h-change">
|
||||||
|
<div class="d2h-code-line">
|
||||||
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
|
<span class="d2h-code-line-ctn"><ins>test1</ins></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>"
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
import { render } from '../file-list-renderer';
|
import { FileListRenderer } from '../file-list-renderer';
|
||||||
import HoganJsUtils from '../hoganjs-utils';
|
import HoganJsUtils from '../hoganjs-utils';
|
||||||
|
import { ColorSchemeType } from '../types';
|
||||||
|
|
||||||
describe('FileListPrinter', () => {
|
describe('FileListRenderer', () => {
|
||||||
describe('generateFileList', () => {
|
describe('render', () => {
|
||||||
it('should expose old and new files to templates', () => {
|
it('should expose old and new files to templates', () => {
|
||||||
const hoganUtils = new HoganJsUtils({
|
const hoganUtils = new HoganJsUtils({
|
||||||
rawTemplates: {
|
rawTemplates: {
|
||||||
|
|
@ -10,6 +11,7 @@ describe('FileListPrinter', () => {
|
||||||
'file-summary-line': '{{oldName}}, {{newName}}, {{fileName}}',
|
'file-summary-line': '{{oldName}}, {{newName}}, {{fileName}}',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
const fileListRenderer = new FileListRenderer(hoganUtils);
|
||||||
const files = [
|
const files = [
|
||||||
{
|
{
|
||||||
isCombined: false,
|
isCombined: false,
|
||||||
|
|
@ -55,7 +57,7 @@ describe('FileListPrinter', () => {
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const fileHtml = render(files, hoganUtils);
|
const fileHtml = fileListRenderer.render(files);
|
||||||
|
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"my/file/name.js, my/file/name.js, my/file/name.js
|
"my/file/name.js, my/file/name.js, my/file/name.js
|
||||||
|
|
@ -67,6 +69,8 @@ describe('FileListPrinter', () => {
|
||||||
|
|
||||||
it('should work for all kinds of files', () => {
|
it('should work for all kinds of files', () => {
|
||||||
const hoganUtils = new HoganJsUtils({});
|
const hoganUtils = new HoganJsUtils({});
|
||||||
|
const fileListRenderer = new FileListRenderer(hoganUtils);
|
||||||
|
|
||||||
const files = [
|
const files = [
|
||||||
{
|
{
|
||||||
isCombined: false,
|
isCombined: false,
|
||||||
|
|
@ -111,9 +115,9 @@ describe('FileListPrinter', () => {
|
||||||
isDeleted: true,
|
isDeleted: true,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
const fileHtml = render(files, hoganUtils);
|
const fileHtml = fileListRenderer.render(files);
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-file-list-wrapper">
|
"<div class="d2h-file-list-wrapper d2h-light-color-scheme">
|
||||||
<div class="d2h-file-list-header">
|
<div class="d2h-file-list-header">
|
||||||
<span class="d2h-file-list-title">Files changed (4)</span>
|
<span class="d2h-file-list-title">Files changed (4)</span>
|
||||||
<a class="d2h-file-switch d2h-hide">hide</a>
|
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||||
|
|
@ -172,5 +176,97 @@ describe('FileListPrinter', () => {
|
||||||
</div>"
|
</div>"
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('with dark colorScheme', () => {
|
||||||
|
it('should include dark colorScheme', () => {
|
||||||
|
const hoganUtils = new HoganJsUtils({});
|
||||||
|
const fileListRenderer = new FileListRenderer(hoganUtils, {
|
||||||
|
colorScheme: ColorSchemeType.DARK,
|
||||||
|
});
|
||||||
|
|
||||||
|
const files = [
|
||||||
|
{
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const fileHtml = fileListRenderer.render(files);
|
||||||
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
|
"<div class="d2h-file-list-wrapper d2h-dark-color-scheme">
|
||||||
|
<div class="d2h-file-list-header">
|
||||||
|
<span class="d2h-file-list-title">Files changed (1)</span>
|
||||||
|
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||||
|
<a class="d2h-file-switch d2h-show">show</a>
|
||||||
|
</div>
|
||||||
|
<ol class="d2h-file-list">
|
||||||
|
<li class="d2h-file-list-line">
|
||||||
|
<span class="d2h-file-name-wrapper">
|
||||||
|
<svg aria-hidden="true" class="d2h-icon d2h-changed" height="16" title="modified" version="1.1"
|
||||||
|
viewBox="0 0 14 16" width="14">
|
||||||
|
<path d="M13 1H1C0.45 1 0 1.45 0 2v12c0 0.55 0.45 1 1 1h12c0.55 0 1-0.45 1-1V2c0-0.55-0.45-1-1-1z m0 13H1V2h12v12zM4 8c0-1.66 1.34-3 3-3s3 1.34 3 3-1.34 3-3 3-3-1.34-3-3z"></path>
|
||||||
|
</svg> <a href="#d2h-781444" class="d2h-file-name">my/file/name.js</a>
|
||||||
|
<span class="d2h-file-stats">
|
||||||
|
<span class="d2h-lines-added">+12</span>
|
||||||
|
<span class="d2h-lines-deleted">-41</span>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div>"
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('with auto colorScheme', () => {
|
||||||
|
it('should include auto colorScheme', () => {
|
||||||
|
const hoganUtils = new HoganJsUtils({});
|
||||||
|
const fileListRenderer = new FileListRenderer(hoganUtils, {
|
||||||
|
colorScheme: ColorSchemeType.AUTO,
|
||||||
|
});
|
||||||
|
|
||||||
|
const files = [
|
||||||
|
{
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const fileHtml = fileListRenderer.render(files);
|
||||||
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
|
"<div class="d2h-file-list-wrapper d2h-auto-color-scheme">
|
||||||
|
<div class="d2h-file-list-header">
|
||||||
|
<span class="d2h-file-list-title">Files changed (1)</span>
|
||||||
|
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||||
|
<a class="d2h-file-switch d2h-show">show</a>
|
||||||
|
</div>
|
||||||
|
<ol class="d2h-file-list">
|
||||||
|
<li class="d2h-file-list-line">
|
||||||
|
<span class="d2h-file-name-wrapper">
|
||||||
|
<svg aria-hidden="true" class="d2h-icon d2h-changed" height="16" title="modified" version="1.1"
|
||||||
|
viewBox="0 0 14 16" width="14">
|
||||||
|
<path d="M13 1H1C0.45 1 0 1.45 0 2v12c0 0.55 0.45 1 1 1h12c0.55 0 1-0.45 1-1V2c0-0.55-0.45-1-1-1z m0 13H1V2h12v12zM4 8c0-1.66 1.34-3 3-3s3 1.34 3 3-1.34 3-3 3-3-1.34-3-3z"></path>
|
||||||
|
</svg> <a href="#d2h-781444" class="d2h-file-name">my/file/name.js</a>
|
||||||
|
<span class="d2h-file-stats">
|
||||||
|
<span class="d2h-lines-added">+12</span>
|
||||||
|
<span class="d2h-lines-deleted">-41</span>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div>"
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
@ -23,9 +23,19 @@ describe('LineByLineRenderer', () => {
|
||||||
|
|
||||||
describe('makeLineHtml', () => {
|
describe('makeLineHtml', () => {
|
||||||
it('should work for insertions', () => {
|
it('should work for insertions', () => {
|
||||||
|
const file = {
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
};
|
||||||
const hoganUtils = new HoganJsUtils({});
|
const hoganUtils = new HoganJsUtils({});
|
||||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||||
type: CSSLineClass.INSERTS,
|
type: CSSLineClass.INSERTS,
|
||||||
prefix: '+',
|
prefix: '+',
|
||||||
content: 'test',
|
content: 'test',
|
||||||
|
|
@ -49,9 +59,19 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should work for deletions', () => {
|
it('should work for deletions', () => {
|
||||||
|
const file = {
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
};
|
||||||
const hoganUtils = new HoganJsUtils({});
|
const hoganUtils = new HoganJsUtils({});
|
||||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||||
type: CSSLineClass.DELETES,
|
type: CSSLineClass.DELETES,
|
||||||
prefix: '-',
|
prefix: '-',
|
||||||
content: 'test',
|
content: 'test',
|
||||||
|
|
@ -75,9 +95,19 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should convert indents into non breakin spaces (2 white spaces)', () => {
|
it('should convert indents into non breakin spaces (2 white spaces)', () => {
|
||||||
|
const file = {
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
};
|
||||||
const hoganUtils = new HoganJsUtils({});
|
const hoganUtils = new HoganJsUtils({});
|
||||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||||
type: CSSLineClass.INSERTS,
|
type: CSSLineClass.INSERTS,
|
||||||
prefix: '+',
|
prefix: '+',
|
||||||
content: ' test',
|
content: ' test',
|
||||||
|
|
@ -101,9 +131,19 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should convert indents into non breakin spaces (4 white spaces)', () => {
|
it('should convert indents into non breakin spaces (4 white spaces)', () => {
|
||||||
|
const file = {
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
};
|
||||||
const hoganUtils = new HoganJsUtils({});
|
const hoganUtils = new HoganJsUtils({});
|
||||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||||
type: CSSLineClass.INSERTS,
|
type: CSSLineClass.INSERTS,
|
||||||
prefix: '+',
|
prefix: '+',
|
||||||
content: ' test',
|
content: ' test',
|
||||||
|
|
@ -127,9 +167,19 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should preserve tabs', () => {
|
it('should preserve tabs', () => {
|
||||||
|
const file = {
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
};
|
||||||
const hoganUtils = new HoganJsUtils({});
|
const hoganUtils = new HoganJsUtils({});
|
||||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||||
type: CSSLineClass.INSERTS,
|
type: CSSLineClass.INSERTS,
|
||||||
prefix: '+',
|
prefix: '+',
|
||||||
content: '\ttest',
|
content: '\ttest',
|
||||||
|
|
@ -399,7 +449,7 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
const html = lineByLineRenderer.render(exampleJson);
|
const html = lineByLineRenderer.render(exampleJson);
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-wrapper">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="txt">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="txt">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -473,7 +523,7 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
const html = lineByLineRenderer.render(exampleJson);
|
const html = lineByLineRenderer.render(exampleJson);
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-wrapper">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -533,7 +583,7 @@ describe('LineByLineRenderer', () => {
|
||||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils);
|
const lineByLineRenderer = new LineByLineRenderer(hoganUtils);
|
||||||
const html = lineByLineRenderer.render(exampleJson);
|
const html = lineByLineRenderer.render(exampleJson);
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-wrapper">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
|
||||||
|
|
@ -278,7 +278,7 @@ describe('SideBySideRenderer', () => {
|
||||||
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, { matching: LineMatchingType.LINES });
|
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, { matching: LineMatchingType.LINES });
|
||||||
const html = sideBySideRenderer.render(exampleJson);
|
const html = sideBySideRenderer.render(exampleJson);
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-wrapper">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="txt">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="txt">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -363,7 +363,7 @@ describe('SideBySideRenderer', () => {
|
||||||
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {});
|
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {});
|
||||||
const html = sideBySideRenderer.render(exampleJson);
|
const html = sideBySideRenderer.render(exampleJson);
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-wrapper">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
@ -434,7 +434,7 @@ describe('SideBySideRenderer', () => {
|
||||||
const sideBySideRenderer = new SideBySideRenderer(hoganUtils);
|
const sideBySideRenderer = new SideBySideRenderer(hoganUtils);
|
||||||
const html = sideBySideRenderer.render(exampleJson);
|
const html = sideBySideRenderer.render(exampleJson);
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
"<div class="d2h-wrapper">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
||||||
<div class="d2h-file-header">
|
<div class="d2h-file-header">
|
||||||
<span class="d2h-file-name-wrapper">
|
<span class="d2h-file-name-wrapper">
|
||||||
|
|
|
||||||
|
|
@ -458,18 +458,16 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
|
||||||
} else if ((values = index.exec(line))) {
|
} else if ((values = index.exec(line))) {
|
||||||
currentFile.checksumBefore = values[1];
|
currentFile.checksumBefore = values[1];
|
||||||
currentFile.checksumAfter = values[2];
|
currentFile.checksumAfter = values[2];
|
||||||
values[3] && (currentFile.mode = values[3]);
|
if (values[3]) currentFile.mode = values[3];
|
||||||
} else if ((values = combinedIndex.exec(line))) {
|
} else if ((values = combinedIndex.exec(line))) {
|
||||||
currentFile.checksumBefore = [values[2], values[3]];
|
currentFile.checksumBefore = [values[2], values[3]];
|
||||||
currentFile.checksumAfter = values[1];
|
currentFile.checksumAfter = values[1];
|
||||||
} else if ((values = combinedMode.exec(line))) {
|
} else if ((values = combinedMode.exec(line))) {
|
||||||
currentFile.oldMode = [values[2], values[3]];
|
currentFile.oldMode = [values[2], values[3]];
|
||||||
currentFile.newMode = values[1];
|
currentFile.newMode = values[1];
|
||||||
// eslint-disable-next-line sonarjs/no-duplicated-branches
|
|
||||||
} else if ((values = combinedNewFile.exec(line))) {
|
} else if ((values = combinedNewFile.exec(line))) {
|
||||||
currentFile.newFileMode = values[1];
|
currentFile.newFileMode = values[1];
|
||||||
currentFile.isNew = true;
|
currentFile.isNew = true;
|
||||||
// eslint-disable-next-line sonarjs/no-duplicated-branches
|
|
||||||
} else if ((values = combinedDeletedFile.exec(line))) {
|
} else if ((values = combinedDeletedFile.exec(line))) {
|
||||||
currentFile.deletedFileMode = values[1];
|
currentFile.deletedFileMode = values[1];
|
||||||
currentFile.isDeleted = true;
|
currentFile.isDeleted = true;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import * as DiffParser from './diff-parser';
|
import * as DiffParser from './diff-parser';
|
||||||
import * as fileListPrinter from './file-list-renderer';
|
import { FileListRenderer } from './file-list-renderer';
|
||||||
import LineByLineRenderer, { LineByLineRendererConfig, defaultLineByLineRendererConfig } from './line-by-line-renderer';
|
import LineByLineRenderer, { LineByLineRendererConfig, defaultLineByLineRendererConfig } from './line-by-line-renderer';
|
||||||
import SideBySideRenderer, { SideBySideRendererConfig, defaultSideBySideRendererConfig } from './side-by-side-renderer';
|
import SideBySideRenderer, { SideBySideRendererConfig, defaultSideBySideRendererConfig } from './side-by-side-renderer';
|
||||||
import { DiffFile, OutputFormatType } from './types';
|
import { DiffFile, OutputFormatType } from './types';
|
||||||
|
|
@ -32,7 +32,10 @@ export function html(diffInput: string | DiffFile[], configuration: Diff2HtmlCon
|
||||||
|
|
||||||
const hoganUtils = new HoganJsUtils(config);
|
const hoganUtils = new HoganJsUtils(config);
|
||||||
|
|
||||||
const fileList = config.drawFileList ? fileListPrinter.render(diffJson, hoganUtils) : '';
|
const { colorScheme } = config;
|
||||||
|
const fileListRendererConfig = { colorScheme };
|
||||||
|
|
||||||
|
const fileList = config.drawFileList ? new FileListRenderer(hoganUtils, fileListRendererConfig).render(diffJson) : '';
|
||||||
|
|
||||||
const diffOutput =
|
const diffOutput =
|
||||||
config.outputFormat === 'side-by-side'
|
config.outputFormat === 'side-by-side'
|
||||||
|
|
|
||||||
|
|
@ -1,33 +1,52 @@
|
||||||
import * as renderUtils from './render-utils';
|
import * as renderUtils from './render-utils';
|
||||||
import HoganJsUtils from './hoganjs-utils';
|
import HoganJsUtils from './hoganjs-utils';
|
||||||
import { DiffFile } from './types';
|
import { ColorSchemeType, DiffFile } from './types';
|
||||||
|
|
||||||
const baseTemplatesPath = 'file-summary';
|
const baseTemplatesPath = 'file-summary';
|
||||||
const iconsBaseTemplatesPath = 'icon';
|
const iconsBaseTemplatesPath = 'icon';
|
||||||
|
|
||||||
export function render(diffFiles: DiffFile[], hoganUtils: HoganJsUtils): string {
|
export interface FileListRendererConfig {
|
||||||
const files = diffFiles
|
colorScheme?: ColorSchemeType;
|
||||||
.map(file =>
|
}
|
||||||
hoganUtils.render(
|
|
||||||
baseTemplatesPath,
|
export const defaultFileListRendererConfig = {
|
||||||
'line',
|
colorScheme: renderUtils.defaultRenderConfig.colorScheme,
|
||||||
{
|
};
|
||||||
fileHtmlId: renderUtils.getHtmlId(file),
|
|
||||||
oldName: file.oldName,
|
export class FileListRenderer {
|
||||||
newName: file.newName,
|
private readonly hoganUtils: HoganJsUtils;
|
||||||
fileName: renderUtils.filenameDiff(file),
|
private readonly config: typeof defaultFileListRendererConfig;
|
||||||
deletedLines: '-' + file.deletedLines,
|
|
||||||
addedLines: '+' + file.addedLines,
|
constructor(hoganUtils: HoganJsUtils, config: FileListRendererConfig = {}) {
|
||||||
},
|
this.hoganUtils = hoganUtils;
|
||||||
{
|
this.config = { ...defaultFileListRendererConfig, ...config };
|
||||||
fileIcon: hoganUtils.template(iconsBaseTemplatesPath, renderUtils.getFileIcon(file)),
|
}
|
||||||
},
|
|
||||||
),
|
render(diffFiles: DiffFile[]): string {
|
||||||
)
|
const files = diffFiles
|
||||||
.join('\n');
|
.map(file =>
|
||||||
|
this.hoganUtils.render(
|
||||||
return hoganUtils.render(baseTemplatesPath, 'wrapper', {
|
baseTemplatesPath,
|
||||||
filesNumber: diffFiles.length,
|
'line',
|
||||||
files: files,
|
{
|
||||||
});
|
fileHtmlId: renderUtils.getHtmlId(file),
|
||||||
|
oldName: file.oldName,
|
||||||
|
newName: file.newName,
|
||||||
|
fileName: renderUtils.filenameDiff(file),
|
||||||
|
deletedLines: '-' + file.deletedLines,
|
||||||
|
addedLines: '+' + file.addedLines,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileIcon: this.hoganUtils.template(iconsBaseTemplatesPath, renderUtils.getFileIcon(file)),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.join('\n');
|
||||||
|
|
||||||
|
return this.hoganUtils.render(baseTemplatesPath, 'wrapper', {
|
||||||
|
colorScheme: renderUtils.colorSchemeToCss(this.config.colorScheme),
|
||||||
|
filesNumber: diffFiles.length,
|
||||||
|
files: files,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ export default class HoganJsUtils {
|
||||||
try {
|
try {
|
||||||
const template = this.preCompiledTemplates[templateKey];
|
const template = this.preCompiledTemplates[templateKey];
|
||||||
return template.render(params, partials, indent);
|
return template.render(params, partials, indent);
|
||||||
} catch (e) {
|
} catch (_e) {
|
||||||
throw new Error(`Could not find template to render '${templateKey}'`);
|
throw new Error(`Could not find template to render '${templateKey}'`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,10 @@ export default class LineByLineRenderer {
|
||||||
})
|
})
|
||||||
.join('\n');
|
.join('\n');
|
||||||
|
|
||||||
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', { content: diffsHtml });
|
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', {
|
||||||
|
colorScheme: renderUtils.colorSchemeToCss(this.config.colorScheme),
|
||||||
|
content: diffsHtml,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
makeFileDiffHtml(file: DiffFile, diffs: string): string {
|
makeFileDiffHtml(file: DiffFile, diffs: string): string {
|
||||||
|
|
@ -103,14 +106,14 @@ export default class LineByLineRenderer {
|
||||||
this.applyLineGroupping(block).forEach(([contextLines, oldLines, newLines]) => {
|
this.applyLineGroupping(block).forEach(([contextLines, oldLines, newLines]) => {
|
||||||
if (oldLines.length && newLines.length && !contextLines.length) {
|
if (oldLines.length && newLines.length && !contextLines.length) {
|
||||||
this.applyRematchMatching(oldLines, newLines, matcher).map(([oldLines, newLines]) => {
|
this.applyRematchMatching(oldLines, newLines, matcher).map(([oldLines, newLines]) => {
|
||||||
const { left, right } = this.processChangedLines(file.isCombined, oldLines, newLines);
|
const { left, right } = this.processChangedLines(file, file.isCombined, oldLines, newLines);
|
||||||
lines += left;
|
lines += left;
|
||||||
lines += right;
|
lines += right;
|
||||||
});
|
});
|
||||||
} else if (contextLines.length) {
|
} else if (contextLines.length) {
|
||||||
contextLines.forEach(line => {
|
contextLines.forEach(line => {
|
||||||
const { prefix, content } = renderUtils.deconstructLine(line.content, file.isCombined);
|
const { prefix, content } = renderUtils.deconstructLine(line.content, file.isCombined);
|
||||||
lines += this.generateSingleLineHtml({
|
lines += this.generateSingleLineHtml(file, {
|
||||||
type: renderUtils.CSSLineClass.CONTEXT,
|
type: renderUtils.CSSLineClass.CONTEXT,
|
||||||
prefix: prefix,
|
prefix: prefix,
|
||||||
content: content,
|
content: content,
|
||||||
|
|
@ -119,7 +122,7 @@ export default class LineByLineRenderer {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else if (oldLines.length || newLines.length) {
|
} else if (oldLines.length || newLines.length) {
|
||||||
const { left, right } = this.processChangedLines(file.isCombined, oldLines, newLines);
|
const { left, right } = this.processChangedLines(file, file.isCombined, oldLines, newLines);
|
||||||
lines += left;
|
lines += left;
|
||||||
lines += right;
|
lines += right;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -188,7 +191,7 @@ export default class LineByLineRenderer {
|
||||||
return doMatching ? matcher(oldLines, newLines) : [[oldLines, newLines]];
|
return doMatching ? matcher(oldLines, newLines) : [[oldLines, newLines]];
|
||||||
}
|
}
|
||||||
|
|
||||||
processChangedLines(isCombined: boolean, oldLines: DiffLine[], newLines: DiffLine[]): FileHtml {
|
processChangedLines(file: DiffFile, isCombined: boolean, oldLines: DiffLine[], newLines: DiffLine[]): FileHtml {
|
||||||
const fileHtml = {
|
const fileHtml = {
|
||||||
right: '',
|
right: '',
|
||||||
left: '',
|
left: '',
|
||||||
|
|
@ -240,7 +243,7 @@ export default class LineByLineRenderer {
|
||||||
}
|
}
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
||||||
const { left, right } = this.generateLineHtml(preparedOldLine, preparedNewLine);
|
const { left, right } = this.generateLineHtml(file, preparedOldLine, preparedNewLine);
|
||||||
fileHtml.left += left;
|
fileHtml.left += left;
|
||||||
fileHtml.right += right;
|
fileHtml.right += right;
|
||||||
}
|
}
|
||||||
|
|
@ -248,14 +251,14 @@ export default class LineByLineRenderer {
|
||||||
return fileHtml;
|
return fileHtml;
|
||||||
}
|
}
|
||||||
|
|
||||||
generateLineHtml(oldLine?: DiffPreparedLine, newLine?: DiffPreparedLine): FileHtml {
|
generateLineHtml(file: DiffFile, oldLine?: DiffPreparedLine, newLine?: DiffPreparedLine): FileHtml {
|
||||||
return {
|
return {
|
||||||
left: this.generateSingleLineHtml(oldLine),
|
left: this.generateSingleLineHtml(file, oldLine),
|
||||||
right: this.generateSingleLineHtml(newLine),
|
right: this.generateSingleLineHtml(file, newLine),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
generateSingleLineHtml(line?: DiffPreparedLine): string {
|
generateSingleLineHtml(file: DiffFile, line?: DiffPreparedLine): string {
|
||||||
if (line === undefined) return '';
|
if (line === undefined) return '';
|
||||||
|
|
||||||
const lineNumberHtml = this.hoganUtils.render(baseTemplatesPath, 'numbers', {
|
const lineNumberHtml = this.hoganUtils.render(baseTemplatesPath, 'numbers', {
|
||||||
|
|
@ -270,6 +273,8 @@ export default class LineByLineRenderer {
|
||||||
prefix: line.prefix === ' ' ? ' ' : line.prefix,
|
prefix: line.prefix === ' ' ? ' ' : line.prefix,
|
||||||
content: line.content,
|
content: line.content,
|
||||||
lineNumber: lineNumberHtml,
|
lineNumber: lineNumberHtml,
|
||||||
|
line,
|
||||||
|
file,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,15 @@ import * as jsDiff from 'diff';
|
||||||
|
|
||||||
import { unifyPath, hashCode } from './utils';
|
import { unifyPath, hashCode } from './utils';
|
||||||
import * as rematch from './rematch';
|
import * as rematch from './rematch';
|
||||||
import { LineMatchingType, DiffStyleType, LineType, DiffLineParts, DiffFile, DiffFileName } from './types';
|
import {
|
||||||
|
ColorSchemeType,
|
||||||
|
DiffFile,
|
||||||
|
DiffFileName,
|
||||||
|
DiffLineParts,
|
||||||
|
DiffStyleType,
|
||||||
|
LineMatchingType,
|
||||||
|
LineType,
|
||||||
|
} from './types';
|
||||||
|
|
||||||
export type CSSLineClass =
|
export type CSSLineClass =
|
||||||
| 'd2h-ins'
|
| 'd2h-ins'
|
||||||
|
|
@ -37,6 +45,7 @@ export interface RenderConfig {
|
||||||
matchWordsThreshold?: number;
|
matchWordsThreshold?: number;
|
||||||
maxLineLengthHighlight?: number;
|
maxLineLengthHighlight?: number;
|
||||||
diffStyle?: DiffStyleType;
|
diffStyle?: DiffStyleType;
|
||||||
|
colorScheme?: ColorSchemeType;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const defaultRenderConfig = {
|
export const defaultRenderConfig = {
|
||||||
|
|
@ -44,6 +53,7 @@ export const defaultRenderConfig = {
|
||||||
matchWordsThreshold: 0.25,
|
matchWordsThreshold: 0.25,
|
||||||
maxLineLengthHighlight: 10000,
|
maxLineLengthHighlight: 10000,
|
||||||
diffStyle: DiffStyleType.WORD,
|
diffStyle: DiffStyleType.WORD,
|
||||||
|
colorScheme: ColorSchemeType.LIGHT,
|
||||||
};
|
};
|
||||||
|
|
||||||
const separator = '/';
|
const separator = '/';
|
||||||
|
|
@ -76,6 +86,18 @@ export function toCSSClass(lineType: LineType): CSSLineClass {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function colorSchemeToCss(colorScheme: ColorSchemeType): string {
|
||||||
|
switch (colorScheme) {
|
||||||
|
case ColorSchemeType.DARK:
|
||||||
|
return 'd2h-dark-color-scheme';
|
||||||
|
case ColorSchemeType.AUTO:
|
||||||
|
return 'd2h-auto-color-scheme';
|
||||||
|
case ColorSchemeType.LIGHT:
|
||||||
|
default:
|
||||||
|
return 'd2h-light-color-scheme';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prefix length of the hunk lines in the diff
|
* Prefix length of the hunk lines in the diff
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,10 @@ export default class SideBySideRenderer {
|
||||||
})
|
})
|
||||||
.join('\n');
|
.join('\n');
|
||||||
|
|
||||||
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', { content: diffsHtml });
|
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', {
|
||||||
|
colorScheme: renderUtils.colorSchemeToCss(this.config.colorScheme),
|
||||||
|
content: diffsHtml,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
makeFileDiffHtml(file: DiffFile, diffs: FileHtml): string {
|
makeFileDiffHtml(file: DiffFile, diffs: FileHtml): string {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<div class="d2h-file-list-wrapper">
|
<div class="d2h-file-list-wrapper {{colorScheme}}">
|
||||||
<div class="d2h-file-list-header">
|
<div class="d2h-file-list-header">
|
||||||
<span class="d2h-file-list-title">Files changed ({{filesNumber}})</span>
|
<span class="d2h-file-list-title">Files changed ({{filesNumber}})</span>
|
||||||
<a class="d2h-file-switch d2h-hide">hide</a>
|
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
<div class="d2h-wrapper">
|
<div class="d2h-wrapper {{colorScheme}}">
|
||||||
{{{content}}}
|
{{{content}}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -91,3 +91,9 @@ export const DiffStyleType: { [_: string]: DiffStyleType } = {
|
||||||
WORD: 'word',
|
WORD: 'word',
|
||||||
CHAR: 'char',
|
CHAR: 'char',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export enum ColorSchemeType {
|
||||||
|
AUTO = 'auto',
|
||||||
|
DARK = 'dark',
|
||||||
|
LIGHT = 'light',
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,82 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
:root,
|
||||||
|
:host {
|
||||||
|
--d2h-bg-color: #fff;
|
||||||
|
--d2h-border-color: #ddd;
|
||||||
|
|
||||||
|
--d2h-dim-color: rgba(0, 0, 0, 0.3);
|
||||||
|
|
||||||
|
--d2h-line-border-color: #eeeeee;
|
||||||
|
|
||||||
|
--d2h-file-header-bg-color: #f7f7f7;
|
||||||
|
--d2h-file-header-border-color: #d8d8d8;
|
||||||
|
|
||||||
|
--d2h-empty-placeholder-bg-color: #f1f1f1;
|
||||||
|
--d2h-empty-placeholder-border-color: #e1e1e1;
|
||||||
|
|
||||||
|
--d2h-selected-color: #c8e1ff;
|
||||||
|
|
||||||
|
--d2h-ins-bg-color: #dfd;
|
||||||
|
--d2h-ins-border-color: #b4e2b4;
|
||||||
|
--d2h-ins-highlight-bg-color: #97f295;
|
||||||
|
--d2h-ins-label-color: #399839;
|
||||||
|
|
||||||
|
--d2h-del-bg-color: #fee8e9;
|
||||||
|
--d2h-del-border-color: #e9aeae;
|
||||||
|
--d2h-del-highlight-bg-color: #ffb6ba;
|
||||||
|
--d2h-del-label-color: #c33;
|
||||||
|
|
||||||
|
--d2h-change-del-color: #fdf2d0;
|
||||||
|
--d2h-change-ins-color: #ded;
|
||||||
|
|
||||||
|
--d2h-info-bg-color: #f8fafd;
|
||||||
|
--d2h-info-border-color: #d5e4f2;
|
||||||
|
|
||||||
|
--d2h-change-label-color: #d0b44c;
|
||||||
|
--d2h-moved-label-color: #3572b0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dark Color Scheme
|
||||||
|
*/
|
||||||
|
|
||||||
|
--d2h-dark-color: rgb(230, 237, 243);
|
||||||
|
--d2h-dark-bg-color: rgb(13, 17, 23);
|
||||||
|
--d2h-dark-border-color: rgb(48, 54, 61);
|
||||||
|
|
||||||
|
--d2h-dark-dim-color: rgb(110, 118, 129);
|
||||||
|
|
||||||
|
--d2h-dark-line-border-color: rgb(33, 38, 45);
|
||||||
|
|
||||||
|
--d2h-dark-file-header-bg-color: rgb(22, 27, 34);
|
||||||
|
--d2h-dark-file-header-border-color: rgb(48, 54, 61);
|
||||||
|
|
||||||
|
--d2h-dark-empty-placeholder-bg-color: rgba(110, 118, 129, 0.1);
|
||||||
|
--d2h-dark-empty-placeholder-border-color: rgb(48, 54, 61);
|
||||||
|
|
||||||
|
--d2h-dark-selected-color: rgba(56, 139, 253, 0.1);
|
||||||
|
|
||||||
|
--d2h-dark-ins-bg-color: rgba(46, 160, 67, 0.15);
|
||||||
|
--d2h-dark-ins-border-color: rgba(46, 160, 67, 0.4);
|
||||||
|
--d2h-dark-ins-highlight-bg-color: rgba(46, 160, 67, 0.4);
|
||||||
|
--d2h-dark-ins-label-color: rgb(63, 185, 80);
|
||||||
|
|
||||||
|
--d2h-dark-del-bg-color: rgba(248, 81, 73, 0.1);
|
||||||
|
--d2h-dark-del-border-color: rgba(248, 81, 73, 0.4);
|
||||||
|
--d2h-dark-del-highlight-bg-color: rgba(248, 81, 73, 0.4);
|
||||||
|
--d2h-dark-del-label-color: rgb(248, 81, 73);
|
||||||
|
|
||||||
|
--d2h-dark-change-del-color: rgba(210, 153, 34, 0.2);
|
||||||
|
--d2h-dark-change-ins-color: rgba(46, 160, 67, 0.25);
|
||||||
|
|
||||||
|
--d2h-dark-info-bg-color: rgba(56, 139, 253, 0.1);
|
||||||
|
--d2h-dark-info-border-color: rgba(56, 139, 253, 0.4);
|
||||||
|
|
||||||
|
--d2h-dark-change-label-color: rgb(210, 153, 34);
|
||||||
|
--d2h-dark-moved-label-color: #3572b0;
|
||||||
|
}
|
||||||
|
|
||||||
.d2h-wrapper {
|
.d2h-wrapper {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
@ -13,10 +89,11 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
height: 35px;
|
height: 35px;
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
border-bottom: 1px solid #d8d8d8;
|
border-bottom: 1px solid var(--d2h-file-header-border-color);
|
||||||
background-color: #f7f7f7;
|
background-color: var(--d2h-file-header-bg-color);
|
||||||
font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-header.d2h-sticky-header {
|
.d2h-file-header.d2h-sticky-header {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
|
@ -33,18 +110,18 @@
|
||||||
|
|
||||||
.d2h-lines-added {
|
.d2h-lines-added {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
border: 1px solid #b4e2b4;
|
border: 1px solid var(--d2h-ins-border-color);
|
||||||
border-radius: 5px 0 0 5px;
|
border-radius: 5px 0 0 5px;
|
||||||
color: #399839;
|
color: var(--d2h-ins-label-color);
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-lines-deleted {
|
.d2h-lines-deleted {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
border: 1px solid #e9aeae;
|
border: 1px solid var(--d2h-del-border-color);
|
||||||
border-radius: 0 5px 5px 0;
|
border-radius: 0 5px 5px 0;
|
||||||
color: #c33;
|
color: var(--d2h-del-label-color);
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
margin-left: 1px;
|
margin-left: 1px;
|
||||||
|
|
@ -68,7 +145,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-wrapper {
|
.d2h-file-wrapper {
|
||||||
border: 1px solid #ddd;
|
border: 1px solid var(--d2h-border-color);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
margin-bottom: 1em;
|
margin-bottom: 1em;
|
||||||
}
|
}
|
||||||
|
|
@ -80,12 +157,12 @@
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
border: 1px solid #ddd;
|
border: 1px solid var(--d2h-border-color);
|
||||||
padding: 4px 8px;
|
padding: 4px 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-collapse.d2h-selected {
|
.d2h-file-collapse.d2h-selected {
|
||||||
background-color: #c8e1ff;
|
background-color: var(--d2h-selected-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-collapse-input {
|
.d2h-file-collapse-input {
|
||||||
|
|
@ -124,7 +201,7 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
width: 100%;
|
width: calc(100% - 16em);
|
||||||
/* Compensate for the absolute positioning of the line numbers */
|
/* Compensate for the absolute positioning of the line numbers */
|
||||||
padding: 0 8em;
|
padding: 0 8em;
|
||||||
}
|
}
|
||||||
|
|
@ -133,7 +210,7 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
width: auto;
|
width: calc(100% - 9em);
|
||||||
/* Compensate for the absolute positioning of the line numbers */
|
/* Compensate for the absolute positioning of the line numbers */
|
||||||
padding: 0 4.5em;
|
padding: 0 4.5em;
|
||||||
}
|
}
|
||||||
|
|
@ -154,9 +231,8 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-top: -1px;
|
margin-top: -1px;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
background-color: #ffb6ba;
|
background-color: var(--d2h-del-highlight-bg-color);
|
||||||
border-radius: 0.2em;
|
border-radius: 0.2em;
|
||||||
vertical-align: middle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-code-line ins,
|
.d2h-code-line ins,
|
||||||
|
|
@ -164,10 +240,9 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-top: -1px;
|
margin-top: -1px;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
background-color: #97f295;
|
background-color: var(--d2h-ins-highlight-bg-color);
|
||||||
border-radius: 0.2em;
|
border-radius: 0.2em;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
vertical-align: middle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-code-line-prefix {
|
.d2h-code-line-prefix {
|
||||||
|
|
@ -202,10 +277,10 @@
|
||||||
/* Keep the numbers fixed on line contents scroll */
|
/* Keep the numbers fixed on line contents scroll */
|
||||||
position: absolute;
|
position: absolute;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
background-color: #fff;
|
background-color: var(--d2h-bg-color);
|
||||||
color: rgba(0, 0, 0, 0.3);
|
color: var(--d2h-dim-color);
|
||||||
text-align: right;
|
text-align: right;
|
||||||
border: solid #eeeeee;
|
border: solid var(--d2h-line-border-color);
|
||||||
border-width: 0 1px 0 1px;
|
border-width: 0 1px 0 1px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
@ -220,10 +295,10 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 4em;
|
width: 4em;
|
||||||
background-color: #fff;
|
background-color: var(--d2h-bg-color);
|
||||||
color: rgba(0, 0, 0, 0.3);
|
color: var(--d2h-dim-color);
|
||||||
text-align: right;
|
text-align: right;
|
||||||
border: solid #eeeeee;
|
border: solid var(--d2h-line-border-color);
|
||||||
border-width: 0 1px 0 1px;
|
border-width: 0 1px 0 1px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
@ -237,8 +312,8 @@
|
||||||
|
|
||||||
.d2h-code-side-emptyplaceholder,
|
.d2h-code-side-emptyplaceholder,
|
||||||
.d2h-emptyplaceholder {
|
.d2h-emptyplaceholder {
|
||||||
background-color: #f1f1f1;
|
background-color: var(--d2h-empty-placeholder-bg-color);
|
||||||
border-color: #e1e1e1;
|
border-color: var(--d2h-empty-placeholder-border-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-code-linenumber,
|
.d2h-code-linenumber,
|
||||||
|
|
@ -258,27 +333,27 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.d2h-del {
|
.d2h-del {
|
||||||
background-color: #fee8e9;
|
background-color: var(--d2h-del-bg-color);
|
||||||
border-color: #e9aeae;
|
border-color: var(--d2h-del-border-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-ins {
|
.d2h-ins {
|
||||||
background-color: #dfd;
|
background-color: var(--d2h-ins-bg-color);
|
||||||
border-color: #b4e2b4;
|
border-color: var(--d2h-ins-border-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-info {
|
.d2h-info {
|
||||||
background-color: #f8fafd;
|
background-color: var(--d2h-info-bg-color);
|
||||||
color: rgba(0, 0, 0, 0.3);
|
color: var(--d2h-dim-color);
|
||||||
border-color: #d5e4f2;
|
border-color: var(--d2h-info-border-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-diff .d2h-del.d2h-change {
|
.d2h-file-diff .d2h-del.d2h-change {
|
||||||
background-color: #fdf2d0;
|
background-color: var(--d2h-change-del-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-diff .d2h-ins.d2h-change {
|
.d2h-file-diff .d2h-ins.d2h-change {
|
||||||
background-color: #ded;
|
background-color: var(--d2h-change-ins-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -291,11 +366,11 @@
|
||||||
|
|
||||||
.d2h-file-list-wrapper a {
|
.d2h-file-list-wrapper a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: #3572b0;
|
color: var(--d2h-moved-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-list-wrapper a:visited {
|
.d2h-file-list-wrapper a:visited {
|
||||||
color: #3572b0;
|
color: var(--d2h-moved-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-list-header {
|
.d2h-file-list-header {
|
||||||
|
|
@ -321,7 +396,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-list > li {
|
.d2h-file-list > li {
|
||||||
border-bottom: #ddd solid 1px;
|
border-bottom: var(--d2h-border-color) solid 1px;
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
@ -343,19 +418,19 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-deleted {
|
.d2h-deleted {
|
||||||
color: #c33;
|
color: var(--d2h-del-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-added {
|
.d2h-added {
|
||||||
color: #399839;
|
color: var(--d2h-ins-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-changed {
|
.d2h-changed {
|
||||||
color: #d0b44c;
|
color: var(--d2h-change-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-moved {
|
.d2h-moved {
|
||||||
color: #3572b0;
|
color: var(--d2h-moved-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-tag {
|
.d2h-tag {
|
||||||
|
|
@ -365,21 +440,302 @@
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
padding: 0 2px;
|
padding: 0 2px;
|
||||||
background-color: #fff;
|
background-color: var(--d2h-bg-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-deleted-tag {
|
.d2h-deleted-tag {
|
||||||
border: #c33 1px solid;
|
border: var(--d2h-del-label-color) 1px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-added-tag {
|
.d2h-added-tag {
|
||||||
border: #399839 1px solid;
|
border: var(--d2h-ins-label-color) 1px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-changed-tag {
|
.d2h-changed-tag {
|
||||||
border: #d0b44c 1px solid;
|
border: var(--d2h-change-label-color) 1px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-moved-tag {
|
.d2h-moved-tag {
|
||||||
border: #3572b0 1px solid;
|
border: var(--d2h-moved-label-color) 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dark Mode Colors
|
||||||
|
*/
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme {
|
||||||
|
color: var(--d2h-dark-color);
|
||||||
|
background-color: var(--d2h-dark-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-file-header {
|
||||||
|
background-color: var(--d2h-dark-file-header-bg-color);
|
||||||
|
border-bottom: var(--d2h-dark-file-header-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-lines-added {
|
||||||
|
border: 1px solid var(--d2h-dark-ins-border-color);
|
||||||
|
color: var(--d2h-dark-ins-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-lines-deleted {
|
||||||
|
border: 1px solid var(--d2h-dark-del-border-color);
|
||||||
|
color: var(--d2h-dark-del-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-code-line del,
|
||||||
|
.d2h-dark-color-scheme .d2h-code-side-line del {
|
||||||
|
background-color: var(--d2h-dark-del-highlight-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-code-line ins,
|
||||||
|
.d2h-dark-color-scheme .d2h-code-side-line ins {
|
||||||
|
background-color: var(--d2h-dark-ins-highlight-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-diff-tbody {
|
||||||
|
border-color: var(--d2h-dark-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-code-side-linenumber {
|
||||||
|
background-color: var(--d2h-dark-bg-color);
|
||||||
|
color: var(--d2h-dark-dim-color);
|
||||||
|
border-color: var(--d2h-dark-line-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-files-diff .d2h-code-side-emptyplaceholder,
|
||||||
|
.d2h-dark-color-scheme .d2h-files-diff .d2h-emptyplaceholder {
|
||||||
|
background-color: var(--d2h-dark-empty-placeholder-bg-color);
|
||||||
|
border-color: var(--d2h-dark-empty-placeholder-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-code-linenumber {
|
||||||
|
background-color: var(--d2h-dark-bg-color);
|
||||||
|
color: var(--d2h-dark-dim-color);
|
||||||
|
border-color: var(--d2h-dark-line-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-del {
|
||||||
|
background-color: var(--d2h-dark-del-bg-color);
|
||||||
|
border-color: var(--d2h-dark-del-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-ins {
|
||||||
|
background-color: var(--d2h-dark-ins-bg-color);
|
||||||
|
border-color: var(--d2h-dark-ins-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-info {
|
||||||
|
background-color: var(--d2h-dark-info-bg-color);
|
||||||
|
color: var(--d2h-dark-dim-color);
|
||||||
|
border-color: var(--d2h-dark-info-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-file-diff .d2h-del.d2h-change {
|
||||||
|
background-color: var(--d2h-dark-change-del-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-file-diff .d2h-ins.d2h-change {
|
||||||
|
background-color: var(--d2h-dark-change-ins-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-file-wrapper {
|
||||||
|
border: 1px solid var(--d2h-dark-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-file-collapse {
|
||||||
|
border: 1px solid var(--d2h-dark-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-file-collapse.d2h-selected {
|
||||||
|
background-color: var(--d2h-dark-selected-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-file-list-wrapper a {
|
||||||
|
color: var(--d2h-dark-moved-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-file-list-wrapper a:visited {
|
||||||
|
color: var(--d2h-dark-moved-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-file-list > li {
|
||||||
|
border-bottom: var(--d2h-dark-bg-color) solid 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-deleted {
|
||||||
|
color: var(--d2h-dark-del-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-added {
|
||||||
|
color: var(--d2h-dark-ins-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-changed {
|
||||||
|
color: var(--d2h-dark-change-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-moved {
|
||||||
|
color: var(--d2h-dark-moved-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-tag {
|
||||||
|
background-color: var(--d2h-dark-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-deleted-tag {
|
||||||
|
border: var(--d2h-dark-del-label-color) 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-added-tag {
|
||||||
|
border: var(--d2h-dark-ins-label-color) 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-changed-tag {
|
||||||
|
border: var(--d2h-dark-change-label-color) 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-moved-tag {
|
||||||
|
border: var(--d2h-dark-moved-label-color) 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto Mode Colors
|
||||||
|
*/
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.d2h-auto-color-scheme {
|
||||||
|
background-color: var(--d2h-dark-bg-color);
|
||||||
|
color: var(--d2h-dark-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-file-header {
|
||||||
|
background-color: var(--d2h-dark-file-header-bg-color);
|
||||||
|
border-bottom: var(--d2h-dark-file-header-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-lines-added {
|
||||||
|
border: 1px solid var(--d2h-dark-ins-border-color);
|
||||||
|
color: var(--d2h-dark-ins-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-lines-deleted {
|
||||||
|
border: 1px solid var(--d2h-dark-del-border-color);
|
||||||
|
color: var(--d2h-dark-del-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-code-line del,
|
||||||
|
.d2h-auto-color-scheme .d2h-code-side-line del {
|
||||||
|
background-color: var(--d2h-dark-del-highlight-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-code-line ins,
|
||||||
|
.d2h-auto-color-scheme .d2h-code-side-line ins {
|
||||||
|
background-color: var(--d2h-dark-ins-highlight-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-diff-tbody {
|
||||||
|
border-color: var(--d2h-dark-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-code-side-linenumber {
|
||||||
|
background-color: var(--d2h-dark-bg-color);
|
||||||
|
color: var(--d2h-dark-dim-color);
|
||||||
|
border-color: var(--d2h-dark-line-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-files-diff .d2h-code-side-emptyplaceholder,
|
||||||
|
.d2h-auto-color-scheme .d2h-files-diff .d2h-emptyplaceholder {
|
||||||
|
background-color: var(--d2h-dark-empty-placeholder-bg-color);
|
||||||
|
border-color: var(--d2h-dark-empty-placeholder-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-code-linenumber {
|
||||||
|
background-color: var(--d2h-dark-bg-color);
|
||||||
|
color: var(--d2h-dark-dim-color);
|
||||||
|
border-color: var(--d2h-dark-line-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-del {
|
||||||
|
background-color: var(--d2h-dark-del-bg-color);
|
||||||
|
border-color: var(--d2h-dark-del-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-ins {
|
||||||
|
background-color: var(--d2h-dark-ins-bg-color);
|
||||||
|
border-color: var(--d2h-dark-ins-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-info {
|
||||||
|
background-color: var(--d2h-dark-info-bg-color);
|
||||||
|
color: var(--d2h-dark-dim-color);
|
||||||
|
border-color: var(--d2h-dark-info-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-file-diff .d2h-del.d2h-change {
|
||||||
|
background-color: var(--d2h-dark-change-del-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-file-diff .d2h-ins.d2h-change {
|
||||||
|
background-color: var(--d2h-dark-change-ins-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-file-wrapper {
|
||||||
|
border: 1px solid var(--d2h-dark-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-file-collapse {
|
||||||
|
border: 1px solid var(--d2h-dark-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-file-collapse.d2h-selected {
|
||||||
|
background-color: var(--d2h-dark-selected-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-file-list-wrapper a {
|
||||||
|
color: var(--d2h-dark-moved-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-file-list-wrapper a:visited {
|
||||||
|
color: var(--d2h-dark-moved-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-file-list > li {
|
||||||
|
border-bottom: var(--d2h-dark-bg-color) solid 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .d2h-deleted {
|
||||||
|
color: var(--d2h-dark-del-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-added {
|
||||||
|
color: var(--d2h-dark-ins-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-changed {
|
||||||
|
color: var(--d2h-dark-change-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-moved {
|
||||||
|
color: var(--d2h-dark-moved-label-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-tag {
|
||||||
|
background-color: var(--d2h-dark-bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-deleted-tag {
|
||||||
|
border: var(--d2h-dark-del-label-color) 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-added-tag {
|
||||||
|
border: var(--d2h-dark-ins-label-color) 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-changed-tag {
|
||||||
|
border: var(--d2h-dark-change-label-color) 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .d2h-moved-tag {
|
||||||
|
border: var(--d2h-dark-moved-label-color) 1px solid;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -151,13 +151,17 @@ export class Diff2HtmlUI {
|
||||||
this.config.highlightLanguages = new Map(Object.entries(this.config.highlightLanguages));
|
this.config.highlightLanguages = new Map(Object.entries(this.config.highlightLanguages));
|
||||||
}
|
}
|
||||||
|
|
||||||
const hljsLanguage =
|
let hljsLanguage =
|
||||||
language && this.config.highlightLanguages.has(language)
|
language && this.config.highlightLanguages.has(language)
|
||||||
? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
? this.config.highlightLanguages.get(language)!
|
||||||
this.config.highlightLanguages.get(language)!
|
|
||||||
: language
|
: language
|
||||||
? getLanguage(language)
|
? getLanguage(language)
|
||||||
: 'plaintext';
|
: 'plaintext';
|
||||||
|
|
||||||
|
// Fallback to plaintext in case language is not loaded
|
||||||
|
if (hljs.getLanguage(hljsLanguage) === undefined) {
|
||||||
|
hljsLanguage = 'plaintext';
|
||||||
|
}
|
||||||
|
|
||||||
// Collect all the code lines and execute the highlight on them
|
// Collect all the code lines and execute the highlight on them
|
||||||
const codeLines = file.querySelectorAll('.d2h-code-line-ctn');
|
const codeLines = file.querySelectorAll('.d2h-code-line-ctn');
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,5 @@ export class Diff2HtmlUI extends Diff2HtmlUIBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Diff2HtmlUIConfig, defaultDiff2HtmlUIConfig };
|
export { defaultDiff2HtmlUIConfig };
|
||||||
|
export type { Diff2HtmlUIConfig };
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,5 @@ export class Diff2HtmlUI extends Diff2HtmlUIBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Diff2HtmlUIConfig, defaultDiff2HtmlUIConfig };
|
export { defaultDiff2HtmlUIConfig };
|
||||||
|
export type { Diff2HtmlUIConfig };
|
||||||
|
|
|
||||||
5
tsconfig.eslint.json
Normal file
5
tsconfig.eslint.json
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"extends": "./tsconfig.json",
|
||||||
|
"exclude": ["node_modules"],
|
||||||
|
"include": ["./**/*"]
|
||||||
|
}
|
||||||
|
|
@ -1,28 +1,37 @@
|
||||||
{
|
{
|
||||||
|
"include": ["src/**/*", "typings/**/*"],
|
||||||
|
"exclude": ["node_modules", "src/__tests__/**"],
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "./_target",
|
"outDir": "bundles-out",
|
||||||
"target": "es5",
|
"module": "CommonJS",
|
||||||
"module": "commonjs",
|
"moduleResolution": "Node",
|
||||||
"moduleResolution": "node",
|
"target": "ES6",
|
||||||
"lib": ["es2020", "dom"],
|
"lib": ["ES6", "DOM"],
|
||||||
|
"jsx": "preserve",
|
||||||
"allowJs": false,
|
"allowJs": false,
|
||||||
|
"checkJs": false,
|
||||||
|
"importHelpers": false,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"resolveJsonModule": true,
|
||||||
"declaration": true,
|
"declaration": true,
|
||||||
"declarationMap": true,
|
"declarationMap": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"noEmit": false,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"incremental": false,
|
||||||
"strictNullChecks": true,
|
"strictNullChecks": true,
|
||||||
"removeComments": true,
|
"removeComments": true,
|
||||||
"preserveConstEnums": true,
|
"preserveConstEnums": true,
|
||||||
"sourceMap": true,
|
|
||||||
"alwaysStrict": true,
|
"alwaysStrict": true,
|
||||||
"strict": true,
|
|
||||||
"noImplicitAny": true,
|
"noImplicitAny": true,
|
||||||
"noImplicitThis": true,
|
"noImplicitThis": true
|
||||||
"noUnusedParameters": true,
|
}
|
||||||
"noUnusedLocals": true,
|
|
||||||
"noImplicitReturns": true,
|
|
||||||
"noFallthroughCasesInSwitch": true,
|
|
||||||
"forceConsistentCasingInFileNames": true,
|
|
||||||
"esModuleInterop": true
|
|
||||||
},
|
|
||||||
"include": ["./src/**/*", "./typings/**/*"],
|
|
||||||
"exclude": ["node_modules", "./src/__tests__/*"]
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
1
typings/merge.d.ts
vendored
1
typings/merge.d.ts
vendored
|
|
@ -1,4 +1,3 @@
|
||||||
declare module 'merge' {
|
declare module 'merge' {
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
||||||
export function recursive(clone: boolean, ...items: object[]): object;
|
export function recursive(clone: boolean, ...items: object[]): object;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ import path from 'path';
|
||||||
import webpack from 'webpack';
|
import webpack from 'webpack';
|
||||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||||
// eslint-disable-next-line import/default
|
|
||||||
import CopyPlugin from 'copy-webpack-plugin';
|
import CopyPlugin from 'copy-webpack-plugin';
|
||||||
|
|
||||||
const pages = ['index', 'demo'];
|
const pages = ['index', 'demo'];
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<div class="hero-body">
|
<div class="hero-body">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1 class="title is-size-1 is-spaced">Demo<a href="#help">
|
<h1 class="title is-size-1 is-spaced">Demo<a href="#help">
|
||||||
<svg height="32" class="octicon octicon-unverified" viewBox="0 0 16 16" version="1.1" width="64"
|
<svg fill="currentColor" height="32" class="octicon octicon-unverified" viewBox="0 0 16 16" version="1.1" width="64"
|
||||||
aria-hidden="true">
|
aria-hidden="true">
|
||||||
<path
|
<path
|
||||||
d="M15.67 7.06l-1.08-1.34c-.17-.22-.28-.48-.31-.77l-.19-1.7a1.51 1.51 0 0 0-1.33-1.33l-1.7-.19c-.3-.03-.56-.16-.78-.33L8.94.32c-.55-.44-1.33-.44-1.88 0L5.72 1.4c-.22.17-.48.28-.77.31l-1.7.19c-.7.08-1.25.63-1.33 1.33l-.19 1.7c-.03.3-.16.56-.33.78L.32 7.05c-.44.55-.44 1.33 0 1.88l1.08 1.34c.17.22.28.48.31.77l.19 1.7c.08.7.63 1.25 1.33 1.33l1.7.19c.3.03.56.16.78.33l1.34 1.08c.55.44 1.33.44 1.88 0l1.34-1.08c.22-.17.48-.28.77-.31l1.7-.19c.7-.08 1.25-.63 1.33-1.33l.19-1.7c.03-.3.16-.56.33-.78l1.08-1.34c.44-.55.44-1.33 0-1.88zM9 11.5c0 .28-.22.5-.5.5h-1c-.27 0-.5-.22-.5-.5v-1c0-.28.23-.5.5-.5h1c.28 0 .5.22.5.5v1zm1.56-4.89c-.06.17-.17.33-.3.47-.13.16-.14.19-.33.38-.16.17-.31.3-.52.45-.11.09-.2.19-.28.27-.08.08-.14.17-.19.27-.05.1-.08.19-.11.3-.03.11-.03.13-.03.25H7.13c0-.22 0-.31.03-.48.03-.19.08-.36.14-.52.06-.14.14-.28.25-.42.11-.13.23-.25.41-.38.27-.19.36-.3.48-.52.12-.22.2-.38.2-.59 0-.27-.06-.45-.2-.58-.13-.13-.31-.19-.58-.19-.09 0-.19.02-.3.05-.11.03-.17.09-.25.16-.08.07-.14.11-.2.2a.41.41 0 0 0-.09.28h-2c0-.38.13-.56.27-.83.16-.27.36-.5.61-.67.25-.17.55-.3.88-.38.33-.08.7-.13 1.09-.13.44 0 .83.05 1.17.13.34.09.63.22.88.39.23.17.41.38.55.63.13.25.19.55.19.88 0 .22 0 .42-.08.59l-.02-.01z">
|
d="M15.67 7.06l-1.08-1.34c-.17-.22-.28-.48-.31-.77l-.19-1.7a1.51 1.51 0 0 0-1.33-1.33l-1.7-.19c-.3-.03-.56-.16-.78-.33L8.94.32c-.55-.44-1.33-.44-1.88 0L5.72 1.4c-.22.17-.48.28-.77.31l-1.7.19c-.7.08-1.25.63-1.33 1.33l-.19 1.7c-.03.3-.16.56-.33.78L.32 7.05c-.44.55-.44 1.33 0 1.88l1.08 1.34c.17.22.28.48.31.77l.19 1.7c.08.7.63 1.25 1.33 1.33l1.7.19c.3.03.56.16.78.33l1.34 1.08c.55.44 1.33.44 1.88 0l1.34-1.08c.22-.17.48-.28.77-.31l1.7-.19c.7-.08 1.25-.63 1.33-1.33l.19-1.7c.03-.3.16-.56.33-.78l1.08-1.34c.44-.55.44-1.33 0-1.88zM9 11.5c0 .28-.22.5-.5.5h-1c-.27 0-.5-.22-.5-.5v-1c0-.28.23-.5.5-.5h1c.28 0 .5.22.5.5v1zm1.56-4.89c-.06.17-.17.33-.3.47-.13.16-.14.19-.33.38-.16.17-.31.3-.52.45-.11.09-.2.19-.28.27-.08.08-.14.17-.19.27-.05.1-.08.19-.11.3-.03.11-.03.13-.03.25H7.13c0-.22 0-.31.03-.48.03-.19.08-.36.14-.52.06-.14.14-.28.25-.42.11-.13.23-.25.41-.38.27-.19.36-.3.48-.52.12-.22.2-.38.2-.59 0-.27-.06-.45-.2-.58-.13-.13-.31-.19-.58-.19-.09 0-.19.02-.3.05-.11.03-.17.09-.25.16-.08.07-.14.11-.2.2a.41.41 0 0 0-.09.28h-2c0-.38.13-.56.27-.83.16-.27.36-.5.61-.67.25-.17.55-.3.88-.38.33-.08.7-.13 1.09-.13.44 0 .83.05 1.17.13.34.09.63.22.88.39.23.17.41.38.55.63.13.25.19.55.19.88 0 .22 0 .42-.08.59l-.02-.01z">
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="columns is-desktop is-multiline">
|
<div class="columns is-desktop is-multiline">
|
||||||
<div class="column is-one-fifth-widescreen">
|
<div class="column is-one-sixth-widescreen">
|
||||||
<label title="Output format of the HTML, either line by line or side by side">
|
<label title="Output format of the HTML, either line by line or side by side">
|
||||||
<p>Output Format</p>
|
<p>Output Format</p>
|
||||||
<select class="options-label-value" id="diff-url-options-output-format" name="outputFormat">
|
<select class="options-label-value" id="diff-url-options-output-format" name="outputFormat">
|
||||||
|
|
@ -42,14 +42,24 @@
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-one-fifth-widescreen">
|
<div class="column is-one-sixth-widescreen">
|
||||||
|
<label title="Color scheme to render. Auto uses user preference.">
|
||||||
|
<p>Color Scheme</p>
|
||||||
|
<select class="options-label-value" id="diff-url-options-color-scheme" name="colorScheme">
|
||||||
|
<option value="light" selected>Light</option>
|
||||||
|
<option value="dark">Dark</option>
|
||||||
|
<option value="auto">Auto</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="column is-one-sixth-widescreen">
|
||||||
<label title="Show the file list summary before the diff">
|
<label title="Show the file list summary before the diff">
|
||||||
<p>File Summary</p>
|
<p>File Summary</p>
|
||||||
<input class="options-label-value" id="diff-url-options-show-files" type="checkbox" name="drawFileList"
|
<input class="options-label-value" id="diff-url-options-show-files" type="checkbox" name="drawFileList"
|
||||||
checked />
|
checked />
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-one-fifth-widescreen">
|
<div class="column is-one-sixth-widescreen">
|
||||||
<label title="Level of matching for the comparison algorithm">
|
<label title="Level of matching for the comparison algorithm">
|
||||||
<p>Matching Type</p>
|
<p>Matching Type</p>
|
||||||
<select class="options-label-value" id="diff-url-options-matching" name="matching">
|
<select class="options-label-value" id="diff-url-options-matching" name="matching">
|
||||||
|
|
@ -59,14 +69,14 @@
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-one-fifth-widescreen">
|
<div class="column is-one-sixth-widescreen">
|
||||||
<label title="Similarity threshold for the matching algorithm">
|
<label title="Similarity threshold for the matching algorithm">
|
||||||
<p>Words Threshold</p>
|
<p>Words Threshold</p>
|
||||||
<input class="options-label-value" id="diff-url-options-match-words-threshold" type="number"
|
<input class="options-label-value" id="diff-url-options-match-words-threshold" type="number"
|
||||||
name="matchWordsThreshold" value="0.25" step="0.05" min="0" max="1" />
|
name="matchWordsThreshold" value="0.25" step="0.05" min="0" max="1" />
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-one-fifth-widescreen">
|
<div class="column is-one-sixth-widescreen">
|
||||||
<label title="Maximum number of comparison performed by the matching algorithm in a block of changes">
|
<label title="Maximum number of comparison performed by the matching algorithm in a block of changes">
|
||||||
<p>Max Comparisons</p>
|
<p>Max Comparisons</p>
|
||||||
<input class="options-label-value" id="diff-url-options-matching-max-comparisons" type="number"
|
<input class="options-label-value" id="diff-url-options-matching-max-comparisons" type="number"
|
||||||
|
|
|
||||||
|
|
@ -5,3 +5,21 @@
|
||||||
.diff-url-btn.is-small {
|
.diff-url-btn.is-small {
|
||||||
font-size: 0.85rem;
|
font-size: 0.85rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .title {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .footer {
|
||||||
|
background-color: #2d2d2d;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.d2h-auto-color-scheme .title {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .footer {
|
||||||
|
background-color: #2d2d2d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,11 @@ import { Diff2HtmlUI, defaultDiff2HtmlUIConfig, Diff2HtmlUIConfig } from '../../
|
||||||
|
|
||||||
import '../../../main.ts';
|
import '../../../main.ts';
|
||||||
import '../../../main.css';
|
import '../../../main.css';
|
||||||
import 'highlight.js/styles/github.css';
|
import './github-highlights.css';
|
||||||
import '../../../../src/ui/css/diff2html.css';
|
import '../../../../src/ui/css/diff2html.css';
|
||||||
import './demo.css';
|
import './demo.css';
|
||||||
|
import { colorSchemeToCss } from '../../../../src/render-utils';
|
||||||
|
import { ColorSchemeType } from '../../../../src/types';
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Example URLs:
|
* Example URLs:
|
||||||
|
|
@ -121,10 +123,16 @@ function prepareRequest(url: string): Request {
|
||||||
|
|
||||||
function getConfiguration(urlParams: URLParams): Diff2HtmlUIConfig {
|
function getConfiguration(urlParams: URLParams): Diff2HtmlUIConfig {
|
||||||
// Removing `diff` and `diffTooBigMessage` form `urlParams` to avoid being inserted
|
// Removing `diff` and `diffTooBigMessage` form `urlParams` to avoid being inserted
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
||||||
const { diff, diffTooBigMessage, ...urlParamsRest } = urlParams;
|
const { diff, diffTooBigMessage, ...urlParamsRest } = urlParams;
|
||||||
|
|
||||||
|
const defaultColorScheme: ColorSchemeType =
|
||||||
|
window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||||
|
? ColorSchemeType.DARK
|
||||||
|
: ColorSchemeType.LIGHT;
|
||||||
|
|
||||||
const config: URLParams = {
|
const config: URLParams = {
|
||||||
...defaultDiff2HtmlUIConfig,
|
...defaultDiff2HtmlUIConfig,
|
||||||
|
colorScheme: defaultColorScheme,
|
||||||
...urlParamsRest,
|
...urlParamsRest,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -132,8 +140,8 @@ function getConfiguration(urlParams: URLParams): Diff2HtmlUIConfig {
|
||||||
const newObject = !Number.isNaN(Number(v))
|
const newObject = !Number.isNaN(Number(v))
|
||||||
? { [k]: Number(v) }
|
? { [k]: Number(v) }
|
||||||
: v === 'true' || v === 'false'
|
: v === 'true' || v === 'false'
|
||||||
? { [k]: Boolean(v) }
|
? { [k]: Boolean(v) }
|
||||||
: { [k]: v };
|
: { [k]: v };
|
||||||
return { ...object, ...newObject };
|
return { ...object, ...newObject };
|
||||||
}, {});
|
}, {});
|
||||||
}
|
}
|
||||||
|
|
@ -155,9 +163,16 @@ async function getDiff(request: Request): Promise<string> {
|
||||||
|
|
||||||
function draw(diffString: string, config: Diff2HtmlUIConfig, elements: Elements): void {
|
function draw(diffString: string, config: Diff2HtmlUIConfig, elements: Elements): void {
|
||||||
const diff2htmlUi = new Diff2HtmlUI(elements.structure.diffTarget, diffString, config);
|
const diff2htmlUi = new Diff2HtmlUI(elements.structure.diffTarget, diffString, config);
|
||||||
|
|
||||||
|
setBodyColorScheme(diff2htmlUi.config.colorScheme);
|
||||||
|
|
||||||
diff2htmlUi.draw();
|
diff2htmlUi.draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setBodyColorScheme(colorScheme: ColorSchemeType): void {
|
||||||
|
document.body.className = colorSchemeToCss(colorScheme);
|
||||||
|
}
|
||||||
|
|
||||||
async function prepareInitialState(elements: Elements): Promise<[Diff2HtmlUIConfig, string]> {
|
async function prepareInitialState(elements: Elements): Promise<[Diff2HtmlUIConfig, string]> {
|
||||||
const urlParams = getParamsFromSearch(window.location.search);
|
const urlParams = getParamsFromSearch(window.location.search);
|
||||||
const currentUrl = (urlParams && urlParams[searchParam]) || 'https://github.com/rtfpessoa/diff2html/pull/106';
|
const currentUrl = (urlParams && urlParams[searchParam]) || 'https://github.com/rtfpessoa/diff2html/pull/106';
|
||||||
|
|
@ -200,6 +215,7 @@ type Elements = {
|
||||||
};
|
};
|
||||||
options: {
|
options: {
|
||||||
outputFormat: HTMLInputElement;
|
outputFormat: HTMLInputElement;
|
||||||
|
colorScheme: HTMLInputElement;
|
||||||
matching: HTMLInputElement;
|
matching: HTMLInputElement;
|
||||||
wordsThreshold: HTMLInputElement;
|
wordsThreshold: HTMLInputElement;
|
||||||
matchingMaxComparisons: HTMLInputElement;
|
matchingMaxComparisons: HTMLInputElement;
|
||||||
|
|
@ -235,6 +251,7 @@ function getHTMLElementById(id: string): HTMLElement {
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', async () => {
|
document.addEventListener('DOMContentLoaded', async () => {
|
||||||
// Improves browser compatibility
|
// Improves browser compatibility
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||||
require('whatwg-fetch');
|
require('whatwg-fetch');
|
||||||
|
|
||||||
const drawAndUpdateUrl = async (
|
const drawAndUpdateUrl = async (
|
||||||
|
|
@ -259,6 +276,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
outputFormat: getHTMLInputElementById('diff-url-options-output-format'),
|
outputFormat: getHTMLInputElementById('diff-url-options-output-format'),
|
||||||
|
colorScheme: getHTMLInputElementById('diff-url-options-color-scheme'),
|
||||||
matching: getHTMLInputElementById('diff-url-options-matching'),
|
matching: getHTMLInputElementById('diff-url-options-matching'),
|
||||||
wordsThreshold: getHTMLInputElementById('diff-url-options-match-words-threshold'),
|
wordsThreshold: getHTMLInputElementById('diff-url-options-match-words-threshold'),
|
||||||
matchingMaxComparisons: getHTMLInputElementById('diff-url-options-matching-max-comparisons'),
|
matchingMaxComparisons: getHTMLInputElementById('diff-url-options-matching-max-comparisons'),
|
||||||
|
|
@ -271,12 +289,13 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||||
let [config, diffString] = await prepareInitialState(elements);
|
let [config, diffString] = await prepareInitialState(elements);
|
||||||
|
|
||||||
// Update HTML inputs from any changes in URL
|
// Update HTML inputs from any changes in URL
|
||||||
config.outputFormat && (elements.options.outputFormat.value = config.outputFormat);
|
if (config.outputFormat) elements.options.outputFormat.value = config.outputFormat;
|
||||||
config.drawFileList && (elements.checkboxes.drawFileList.checked = config.drawFileList);
|
if (config.colorScheme) elements.options.colorScheme.value = config.colorScheme;
|
||||||
config.matching && (elements.options.matching.value = config.matching);
|
if (config.drawFileList) elements.checkboxes.drawFileList.checked = config.drawFileList;
|
||||||
config.matchWordsThreshold && (elements.options.wordsThreshold.value = config.matchWordsThreshold.toString());
|
if (config.matching) elements.options.matching.value = config.matching;
|
||||||
config.matchingMaxComparisons &&
|
if (config.matchWordsThreshold) elements.options.wordsThreshold.value = config.matchWordsThreshold.toString();
|
||||||
(elements.options.matchingMaxComparisons.value = config.matchingMaxComparisons.toString());
|
if (config.matchingMaxComparisons)
|
||||||
|
elements.options.matchingMaxComparisons.value = config.matchingMaxComparisons.toString();
|
||||||
|
|
||||||
Object.entries(elements.options).forEach(([option, element]) =>
|
Object.entries(elements.options).forEach(([option, element]) =>
|
||||||
element.addEventListener('change', () => {
|
element.addEventListener('change', () => {
|
||||||
|
|
|
||||||
332
website/templates/pages/demo/github-highlights.css
Normal file
332
website/templates/pages/demo/github-highlights.css
Normal file
|
|
@ -0,0 +1,332 @@
|
||||||
|
/*!
|
||||||
|
Theme Adapted from highlight.js github theme
|
||||||
|
Theme: Modified GitHub Dark
|
||||||
|
Description: Dark theme as seen on github.com, modified for diff2html demo
|
||||||
|
Author: github.com
|
||||||
|
Maintainer: @Hirse
|
||||||
|
Updated: 2021-05-15
|
||||||
|
|
||||||
|
Outdated base version: https://github.com/primer/github-syntax-dark
|
||||||
|
Current colors taken from GitHub's CSS
|
||||||
|
*/
|
||||||
|
|
||||||
|
pre code.hljs {
|
||||||
|
display: block;
|
||||||
|
overflow-x: auto;
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
code.hljs {
|
||||||
|
padding: 3px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs {
|
||||||
|
color: #24292e;
|
||||||
|
}
|
||||||
|
.hljs-doctag,
|
||||||
|
.hljs-keyword,
|
||||||
|
.hljs-meta .hljs-keyword,
|
||||||
|
.hljs-template-tag,
|
||||||
|
.hljs-template-variable,
|
||||||
|
.hljs-type,
|
||||||
|
.hljs-variable.language_ {
|
||||||
|
color: #d73a49;
|
||||||
|
}
|
||||||
|
.hljs-title,
|
||||||
|
.hljs-title.class_,
|
||||||
|
.hljs-title.class_.inherited__,
|
||||||
|
.hljs-title.function_ {
|
||||||
|
color: #6f42c1;
|
||||||
|
}
|
||||||
|
.hljs-attr,
|
||||||
|
.hljs-attribute,
|
||||||
|
.hljs-literal,
|
||||||
|
.hljs-meta,
|
||||||
|
.hljs-number,
|
||||||
|
.hljs-operator,
|
||||||
|
.hljs-selector-attr,
|
||||||
|
.hljs-selector-class,
|
||||||
|
.hljs-selector-id,
|
||||||
|
.hljs-variable {
|
||||||
|
color: #005cc5;
|
||||||
|
}
|
||||||
|
.hljs-meta .hljs-string,
|
||||||
|
.hljs-regexp,
|
||||||
|
.hljs-string {
|
||||||
|
color: #032f62;
|
||||||
|
}
|
||||||
|
.hljs-built_in,
|
||||||
|
.hljs-symbol {
|
||||||
|
color: #e36209;
|
||||||
|
}
|
||||||
|
.hljs-code,
|
||||||
|
.hljs-comment,
|
||||||
|
.hljs-formula {
|
||||||
|
color: #6a737d;
|
||||||
|
}
|
||||||
|
.hljs-name,
|
||||||
|
.hljs-quote,
|
||||||
|
.hljs-selector-pseudo,
|
||||||
|
.hljs-selector-tag {
|
||||||
|
color: #22863a;
|
||||||
|
}
|
||||||
|
.hljs-subst {
|
||||||
|
color: #24292e;
|
||||||
|
}
|
||||||
|
.hljs-section {
|
||||||
|
color: #005cc5;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.hljs-bullet {
|
||||||
|
color: #735c0f;
|
||||||
|
}
|
||||||
|
.hljs-emphasis {
|
||||||
|
color: #24292e;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.hljs-strong {
|
||||||
|
color: #24292e;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.hljs-addition {
|
||||||
|
color: #22863a;
|
||||||
|
background-color: #f0fff4;
|
||||||
|
}
|
||||||
|
.hljs-deletion {
|
||||||
|
color: #b31d28;
|
||||||
|
background-color: #ffeef0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .hljs {
|
||||||
|
color: #c9d1d9;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-doctag,
|
||||||
|
.d2h-dark-color-scheme .hljs-keyword,
|
||||||
|
.d2h-dark-color-scheme .hljs-meta .hljs-keyword,
|
||||||
|
.d2h-dark-color-scheme .hljs-template-tag,
|
||||||
|
.d2h-dark-color-scheme .hljs-template-variable,
|
||||||
|
.d2h-dark-color-scheme .hljs-type,
|
||||||
|
.d2h-dark-color-scheme .hljs-variable.language_ {
|
||||||
|
color: #ff7b72;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-title,
|
||||||
|
.d2h-dark-color-scheme .hljs-title.class_,
|
||||||
|
.d2h-dark-color-scheme .hljs-title.class_.inherited__,
|
||||||
|
.d2h-dark-color-scheme .hljs-title.function_ {
|
||||||
|
color: #d2a8ff;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-attr,
|
||||||
|
.d2h-dark-color-scheme .hljs-attribute,
|
||||||
|
.d2h-dark-color-scheme .hljs-literal,
|
||||||
|
.d2h-dark-color-scheme .hljs-meta,
|
||||||
|
.d2h-dark-color-scheme .hljs-number,
|
||||||
|
.d2h-dark-color-scheme .hljs-operator,
|
||||||
|
.d2h-dark-color-scheme .hljs-selector-attr,
|
||||||
|
.d2h-dark-color-scheme .hljs-selector-class,
|
||||||
|
.d2h-dark-color-scheme .hljs-selector-id,
|
||||||
|
.d2h-dark-color-scheme .hljs-variable {
|
||||||
|
color: #79c0ff;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-meta .hljs-string,
|
||||||
|
.d2h-dark-color-scheme .hljs-regexp,
|
||||||
|
.d2h-dark-color-scheme .hljs-string {
|
||||||
|
color: #a5d6ff;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-built_in,
|
||||||
|
.d2h-dark-color-scheme .hljs-symbol {
|
||||||
|
color: #ffa657;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-code,
|
||||||
|
.d2h-dark-color-scheme .hljs-comment,
|
||||||
|
.d2h-dark-color-scheme .hljs-formula {
|
||||||
|
color: #8b949e;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-name,
|
||||||
|
.d2h-dark-color-scheme .hljs-quote,
|
||||||
|
.d2h-dark-color-scheme .hljs-selector-pseudo,
|
||||||
|
.d2h-dark-color-scheme .hljs-selector-tag {
|
||||||
|
color: #7ee787;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-subst {
|
||||||
|
color: #c9d1d9;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-section {
|
||||||
|
color: #1f6feb;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-bullet {
|
||||||
|
color: #f2cc60;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-emphasis {
|
||||||
|
color: #c9d1d9;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-strong {
|
||||||
|
color: #c9d1d9;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-addition {
|
||||||
|
color: #aff5b4;
|
||||||
|
background-color: #033a16;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-deletion {
|
||||||
|
color: #ffdcd7;
|
||||||
|
background-color: #67060c;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.d2h-auto-color-scheme .hljs {
|
||||||
|
color: #c9d1d9;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-doctag,
|
||||||
|
.d2h-auto-color-scheme .hljs-keyword,
|
||||||
|
.d2h-auto-color-scheme .hljs-meta .hljs-keyword,
|
||||||
|
.d2h-auto-color-scheme .hljs-template-tag,
|
||||||
|
.d2h-auto-color-scheme .hljs-template-variable,
|
||||||
|
.d2h-auto-color-scheme .hljs-type,
|
||||||
|
.d2h-auto-color-scheme .hljs-variable.language_ {
|
||||||
|
color: #ff7b72;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-title,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.class_,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.class_.inherited__,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.function_ {
|
||||||
|
color: #d2a8ff;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-attr,
|
||||||
|
.d2h-auto-color-scheme .hljs-attribute,
|
||||||
|
.d2h-auto-color-scheme .hljs-literal,
|
||||||
|
.d2h-auto-color-scheme .hljs-meta,
|
||||||
|
.d2h-auto-color-scheme .hljs-number,
|
||||||
|
.d2h-auto-color-scheme .hljs-operator,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-attr,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-class,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-id,
|
||||||
|
.d2h-auto-color-scheme .hljs-variable {
|
||||||
|
color: #79c0ff;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-meta .hljs-string,
|
||||||
|
.d2h-auto-color-scheme .hljs-regexp,
|
||||||
|
.d2h-auto-color-scheme .hljs-string {
|
||||||
|
color: #a5d6ff;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-built_in,
|
||||||
|
.d2h-auto-color-scheme .hljs-symbol {
|
||||||
|
color: #ffa657;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-code,
|
||||||
|
.d2h-auto-color-scheme .hljs-comment,
|
||||||
|
.d2h-auto-color-scheme .hljs-formula {
|
||||||
|
color: #8b949e;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-name,
|
||||||
|
.d2h-auto-color-scheme .hljs-quote,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-pseudo,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-tag {
|
||||||
|
color: #7ee787;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-subst {
|
||||||
|
color: #c9d1d9;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-section {
|
||||||
|
color: #1f6feb;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-bullet {
|
||||||
|
color: #f2cc60;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-emphasis {
|
||||||
|
color: #c9d1d9;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-strong {
|
||||||
|
color: #c9d1d9;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-addition {
|
||||||
|
color: #aff5b4;
|
||||||
|
background-color: #033a16;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-deletion {
|
||||||
|
color: #ffdcd7;
|
||||||
|
background-color: #67060c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
.d2h-auto-color-scheme .hljs {
|
||||||
|
color: #24292e;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-doctag,
|
||||||
|
.d2h-auto-color-scheme .hljs-keyword,
|
||||||
|
.d2h-auto-color-scheme .hljs-meta .hljs-keyword,
|
||||||
|
.d2h-auto-color-scheme .hljs-template-tag,
|
||||||
|
.d2h-auto-color-scheme .hljs-template-variable,
|
||||||
|
.d2h-auto-color-scheme .hljs-type,
|
||||||
|
.d2h-auto-color-scheme .hljs-variable.language_ {
|
||||||
|
color: #d73a49;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-title,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.class_,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.class_.inherited__,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.function_ {
|
||||||
|
color: #6f42c1;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-attr,
|
||||||
|
.d2h-auto-color-scheme .hljs-attribute,
|
||||||
|
.d2h-auto-color-scheme .hljs-literal,
|
||||||
|
.d2h-auto-color-scheme .hljs-meta,
|
||||||
|
.d2h-auto-color-scheme .hljs-number,
|
||||||
|
.d2h-auto-color-scheme .hljs-operator,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-attr,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-class,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-id,
|
||||||
|
.d2h-auto-color-scheme .hljs-variable {
|
||||||
|
color: #005cc5;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-meta .hljs-string,
|
||||||
|
.d2h-auto-color-scheme .hljs-regexp,
|
||||||
|
.d2h-auto-color-scheme .hljs-string {
|
||||||
|
color: #032f62;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-built_in,
|
||||||
|
.d2h-auto-color-scheme .hljs-symbol {
|
||||||
|
color: #e36209;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-code,
|
||||||
|
.d2h-auto-color-scheme .hljs-comment,
|
||||||
|
.d2h-auto-color-scheme .hljs-formula {
|
||||||
|
color: #6a737d;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-name,
|
||||||
|
.d2h-auto-color-scheme .hljs-quote,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-pseudo,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-tag {
|
||||||
|
color: #22863a;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-subst {
|
||||||
|
color: #24292e;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-section {
|
||||||
|
color: #005cc5;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-bullet {
|
||||||
|
color: #735c0f;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-emphasis {
|
||||||
|
color: #24292e;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-strong {
|
||||||
|
color: #24292e;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-addition {
|
||||||
|
color: #22863a;
|
||||||
|
background-color: #f0fff4;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-deletion {
|
||||||
|
color: #b31d28;
|
||||||
|
background-color: #ffeef0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -72,7 +72,7 @@
|
||||||
<span class="button clipboard" data-clipboard-text="npm install diff2html" title="Copy">Copy</span>
|
<span class="button clipboard" data-clipboard-text="npm install diff2html" title="Copy">Copy</span>
|
||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="https://github.com/rtfpessoa/diff2html#how-to-use" target="_blank" rel="noopener" rel="noreferrer">
|
<a href="https://github.com/rtfpessoa/diff2html#usage" target="_blank" rel="noopener" rel="noreferrer">
|
||||||
Find usage examples in the Docs
|
Find usage examples in the Docs
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
@ -510,7 +510,7 @@
|
||||||
<a href="https://gitter.im/rtfpessoa/diff2html" target="_blank" rel="noopener" rel="noreferrer">Gitter</a>.
|
<a href="https://gitter.im/rtfpessoa/diff2html" target="_blank" rel="noopener" rel="noreferrer">Gitter</a>.
|
||||||
Need any help?
|
Need any help?
|
||||||
</p>
|
</p>
|
||||||
<a href="https://github.com/rtfpessoa/diff2html#how-to-use" target="_blank" rel="noopener" rel="noreferrer">
|
<a href="https://github.com/rtfpessoa/diff2html#usage" target="_blank" rel="noopener" rel="noreferrer">
|
||||||
Read more in the Docs
|
Read more in the Docs
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-booticon {
|
.hero-booticon {
|
||||||
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
|
font-family:
|
||||||
|
Helvetica Neue,
|
||||||
|
Helvetica,
|
||||||
|
Arial,
|
||||||
|
sans-serif;
|
||||||
margin: 0 auto 30px;
|
margin: 0 auto 30px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
font-size: 8vw;
|
font-size: 8vw;
|
||||||
|
|
|
||||||
|
|
@ -4,5 +4,4 @@ import '../../../main.ts';
|
||||||
import '../../../main.css';
|
import '../../../main.css';
|
||||||
import './index.css';
|
import './index.css';
|
||||||
|
|
||||||
// eslint-disable-next-line no-new
|
|
||||||
new Clipboard(document.getElementsByClassName('clipboard')[0]);
|
new Clipboard(document.getElementsByClassName('clipboard')[0]);
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@
|
||||||
<a href="https://twitter.com/rtfpessoa" target="_blank" rel="noopener" rel="noreferrer">@rtfpessoa</a>.
|
<a href="https://twitter.com/rtfpessoa" target="_blank" rel="noopener" rel="noreferrer">@rtfpessoa</a>.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a class="footer-list-link" href="https://github.com/rtfpessoa/diff2html#how-to-use" target="_blank"
|
<a class="footer-list-link" href="https://github.com/rtfpessoa/diff2html#usage" target="_blank"
|
||||||
rel="noopener" rel="noreferrer">FAQ</a>
|
rel="noopener" rel="noreferrer">FAQ</a>
|
||||||
-
|
-
|
||||||
<a class="footer-list-link" href="https://diff2html.xyz">diff2html</a>
|
<a class="footer-list-link" href="https://diff2html.xyz">diff2html</a>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue