Compare commits
No commits in common. "master" and "3.0.0" have entirely different histories.
61 changed files with 13242 additions and 23724 deletions
|
|
@ -52,8 +52,7 @@
|
|||
"avatar_url": "https://avatars0.githubusercontent.com/u/8504000?v=4",
|
||||
"profile": "http://heyitsmattwade.com",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code"
|
||||
"bug"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -80,8 +79,7 @@
|
|||
"avatar_url": "https://avatars0.githubusercontent.com/u/1567423?v=4",
|
||||
"profile": "https://saino.me/",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code"
|
||||
"bug"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -99,8 +97,7 @@
|
|||
"avatar_url": "https://avatars2.githubusercontent.com/u/7767299?v=4",
|
||||
"profile": "http://wesssel.github.io/",
|
||||
"contributions": [
|
||||
"security",
|
||||
"code"
|
||||
"security"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -118,8 +115,7 @@
|
|||
"avatar_url": "https://avatars1.githubusercontent.com/u/1446970?v=4",
|
||||
"profile": "https://github.com/sss0791",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code"
|
||||
"bug"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -128,8 +124,7 @@
|
|||
"avatar_url": "https://avatars3.githubusercontent.com/u/4741620?v=4",
|
||||
"profile": "http://researcher.watson.ibm.com/researcher/view.php?person=us-nickm",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code"
|
||||
"bug"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -147,8 +142,7 @@
|
|||
"avatar_url": "https://avatars3.githubusercontent.com/u/8926560?v=4",
|
||||
"profile": "https://twitter.com/pubkeypubkey",
|
||||
"contributions": [
|
||||
"doc",
|
||||
"code"
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -166,9 +160,7 @@
|
|||
"avatar_url": "https://avatars0.githubusercontent.com/u/1823771?v=4",
|
||||
"profile": "https://akr.am",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"doc",
|
||||
"code"
|
||||
"bug"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -186,8 +178,7 @@
|
|||
"avatar_url": "https://avatars0.githubusercontent.com/u/8316?v=4",
|
||||
"profile": "http://twitter.com/dimasabanin",
|
||||
"contributions": [
|
||||
"maintenance",
|
||||
"code"
|
||||
"maintenance"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -205,8 +196,7 @@
|
|||
"avatar_url": "https://avatars1.githubusercontent.com/u/2196373?v=4",
|
||||
"profile": "http://webminer.js.org",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"doc"
|
||||
"bug"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -233,6 +223,7 @@
|
|||
"avatar_url": "https://avatars0.githubusercontent.com/u/1155220?v=4",
|
||||
"profile": "https://github.com/escitalopram",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code"
|
||||
]
|
||||
},
|
||||
|
|
@ -254,88 +245,6 @@
|
|||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "apeckham",
|
||||
"name": "Aaron",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/14110?v=4",
|
||||
"profile": "https://github.com/apeckham",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "pgrimaud",
|
||||
"name": "Pierre Grimaud",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/1866496?v=4",
|
||||
"profile": "https://github.com/pgrimaud",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "domdomegg",
|
||||
"name": "Adam Jones",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/4953590?v=4",
|
||||
"profile": "https://domdomegg.github.io/",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "charguer",
|
||||
"name": "Arthur Charguéraud",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/1830652?v=4",
|
||||
"profile": "https://github.com/charguer",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Pierrci",
|
||||
"name": "Pierric Cistac",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/5020707?v=4",
|
||||
"profile": "https://twitter.com/pierrci",
|
||||
"contributions": [
|
||||
"doc",
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "xlith",
|
||||
"name": "Civan Yavuzşen",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/510560?v=4",
|
||||
"profile": "https://github.com/xlith",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "timgates42",
|
||||
"name": "Tim Gates",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/47873678?v=4",
|
||||
"profile": "https://github.com/timgates42",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "campersau",
|
||||
"name": "campersau",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/u/4009570?v=4",
|
||||
"profile": "https://github.com/campersau",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "dependabot-preview[bot]",
|
||||
"name": "dependabot-preview[bot]",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/in/2141?v=4",
|
||||
"profile": "https://github.com/apps/dependabot-preview",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
],
|
||||
"contributorsPerLine": 7
|
||||
|
|
|
|||
214
.circleci/config.yml
Normal file
214
.circleci/config.yml
Normal file
|
|
@ -0,0 +1,214 @@
|
|||
version: 2.1
|
||||
|
||||
jobs:
|
||||
checkout-and-version:
|
||||
docker:
|
||||
- image: codacy/git-version
|
||||
working_directory: ~/workdir
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
name: Get next version
|
||||
command: |
|
||||
export NEXT_VERSION="$(/bin/git-version --folder=$PWD --release-branch=master)"
|
||||
echo "Next version is ${NEXT_VERSION}"
|
||||
echo "${NEXT_VERSION}" > .version
|
||||
- run:
|
||||
name: Get next npm tag name
|
||||
command: |
|
||||
if [ "${CIRCLE_BRANCH}" = "master" ]; then
|
||||
export PUBLISH_TAG="latest"
|
||||
elif [ "${CIRCLE_BRANCH}" = "next" ]; then
|
||||
export PUBLISH_TAG="next"
|
||||
else
|
||||
export PUBLISH_TAG="pr"
|
||||
fi
|
||||
echo "Next tag is ${PUBLISH_TAG}"
|
||||
echo "${PUBLISH_TAG}" > .tag
|
||||
- persist_to_workspace:
|
||||
root: ~/workdir
|
||||
paths:
|
||||
- '*'
|
||||
|
||||
build-common: &common-build
|
||||
docker:
|
||||
- image: node
|
||||
working_directory: ~/workdir
|
||||
steps:
|
||||
- attach_workspace:
|
||||
at: ~/workdir
|
||||
- restore_cache:
|
||||
key: yarn-cache-{{ checksum "yarn.lock" }}
|
||||
- run:
|
||||
name: Log environment setup
|
||||
command: |
|
||||
node -v
|
||||
yarn -v
|
||||
- run:
|
||||
name: Install dependencies
|
||||
command: yarn
|
||||
- save_cache:
|
||||
key: yarn-cache-{{ checksum "yarn.lock" }}
|
||||
paths:
|
||||
- /usr/local/share/.cache/yarn
|
||||
- run: yarn run validate
|
||||
- store_artifacts:
|
||||
path: coverage
|
||||
- store_test_results:
|
||||
path: coverage
|
||||
|
||||
build-latest: &latest-build
|
||||
docker:
|
||||
- image: node
|
||||
working_directory: ~/workdir
|
||||
steps:
|
||||
- attach_workspace:
|
||||
at: ~/workdir
|
||||
- restore_cache:
|
||||
key: yarn-cache-{{ checksum "yarn.lock" }}
|
||||
- run:
|
||||
name: Log environment setup
|
||||
command: |
|
||||
node -v
|
||||
yarn -v
|
||||
- run:
|
||||
name: Install dependencies
|
||||
command: yarn
|
||||
- save_cache:
|
||||
key: yarn-cache-{{ checksum "yarn.lock" }}
|
||||
paths:
|
||||
- /usr/local/share/.cache/yarn
|
||||
- run: yarn run validate
|
||||
- store_artifacts:
|
||||
path: coverage
|
||||
- store_test_results:
|
||||
path: coverage
|
||||
- run: yarn run coverage:push
|
||||
- persist_to_workspace:
|
||||
root: ~/workdir
|
||||
paths:
|
||||
- '*'
|
||||
|
||||
build-node-10:
|
||||
<<: *common-build
|
||||
docker:
|
||||
- image: node:10
|
||||
|
||||
build-node-11:
|
||||
<<: *common-build
|
||||
docker:
|
||||
- image: node:11
|
||||
|
||||
build-node-12:
|
||||
<<: *common-build
|
||||
docker:
|
||||
- image: node:12
|
||||
|
||||
build-node-13:
|
||||
<<: *latest-build
|
||||
docker:
|
||||
- image: node:13
|
||||
|
||||
publish_library:
|
||||
docker:
|
||||
- image: node:13
|
||||
working_directory: ~/workdir
|
||||
steps:
|
||||
- attach_workspace:
|
||||
at: ~/workdir
|
||||
- run:
|
||||
name: Configure Yarn version
|
||||
command: |
|
||||
yarn config set version-tag-prefix ""
|
||||
yarn config set version-git-message "Release version %s"
|
||||
- run:
|
||||
name: Configure Git
|
||||
command: |
|
||||
git config user.email "circleci@users.noreply.github.com"
|
||||
git config user.name "CircleCI"
|
||||
- run:
|
||||
name: Version package
|
||||
command: |
|
||||
# Update version in packages to publish
|
||||
yarn version --non-interactive --new-version $(cat .version)
|
||||
git push --tags "https://rtfpessoa:$GPR_AUTH_TOKEN@github.com/rtfpessoa/diff2html"
|
||||
- run:
|
||||
name: Setup npm credentials
|
||||
command: |
|
||||
rm -f .npmrc
|
||||
touch .npmrc
|
||||
echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" >> .npmrc
|
||||
echo "registry=https://registry.npmjs.org/" >> .npmrc
|
||||
echo "access=public" >> .npmrc
|
||||
echo "save-exact=true" >> .npmrc
|
||||
- run:
|
||||
name: Publish npm package
|
||||
command: |
|
||||
# Publish package versions to npmjs.org
|
||||
yarn publish --tag $(cat .tag) --non-interactive --new-version $(cat .version)
|
||||
- run:
|
||||
name: Setup gpr credentials
|
||||
command: |
|
||||
rm -f .npmrc
|
||||
touch .npmrc
|
||||
echo "//npm.pkg.github.com/:_authToken=${GPR_AUTH_TOKEN}" >> .npmrc
|
||||
echo "@rtfpessoa:registry=https://npm.pkg.github.com/" >> .npmrc
|
||||
echo "access=public" >> .npmrc
|
||||
echo "save-exact=true" >> .npmrc
|
||||
- run:
|
||||
name: Publish gpr package
|
||||
command: |
|
||||
# HACK: Override npm package name to be able to publish in GitHub
|
||||
sed -i 's/^ "name":.*/ "name": "@rtfpessoa\/diff2html",/g' package.json
|
||||
echo "Going to publish version $(cat .version) to GitHub"
|
||||
yarn publish --tag $(cat .tag) --non-interactive --new-version $(cat .version)
|
||||
# HACK: Restore npm package name
|
||||
sed -i 's/^ "name":.*/ "name": "diff2html",/g' package.json
|
||||
|
||||
publish_website:
|
||||
machine:
|
||||
enabled: true
|
||||
working_directory: ~/workdir
|
||||
steps:
|
||||
- attach_workspace:
|
||||
at: ~/workdir
|
||||
- run:
|
||||
name: Deploy
|
||||
working_directory: ~/workdir/docs
|
||||
command: |
|
||||
aws s3 sync --region eu-west-1 --delete . s3://diff2html.xyz --metadata-directive REPLACE --cache-control max-age=31557600
|
||||
aws cloudfront create-invalidation --region eu-west-1 --distribution-id $AWS_CF_DISTRIBUTION_ID --paths /index.html /demo.html /sitemap.xml /robots.txt
|
||||
|
||||
workflows:
|
||||
validate-and-publish:
|
||||
jobs:
|
||||
- checkout-and-version
|
||||
- build-node-10:
|
||||
requires:
|
||||
- checkout-and-version
|
||||
- build-node-11:
|
||||
requires:
|
||||
- checkout-and-version
|
||||
- build-node-12:
|
||||
requires:
|
||||
- checkout-and-version
|
||||
- build-node-13:
|
||||
requires:
|
||||
- checkout-and-version
|
||||
- publish_approval:
|
||||
type: approval
|
||||
requires:
|
||||
- build-node-10
|
||||
- build-node-11
|
||||
- build-node-12
|
||||
- build-node-13
|
||||
- publish_library:
|
||||
requires:
|
||||
- publish_approval
|
||||
- publish_website:
|
||||
requires:
|
||||
- publish_approval
|
||||
filters:
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
58
.eslintrc.js
Normal file
58
.eslintrc.js
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
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',
|
||||
'prettier/@typescript-eslint',
|
||||
'prettier/babel',
|
||||
],
|
||||
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',
|
||||
},
|
||||
};
|
||||
12
.github/workflows/ci.yml
vendored
12
.github/workflows/ci.yml
vendored
|
|
@ -1,12 +0,0 @@
|
|||
name: ci
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [master]
|
||||
|
||||
jobs:
|
||||
test-and-publish:
|
||||
uses: ./.github/workflows/test-and-publish.yml
|
||||
with:
|
||||
environment: dev
|
||||
secrets: inherit
|
||||
35
.github/workflows/release.yml
vendored
35
.github/workflows/release.yml
vendored
|
|
@ -1,35 +0,0 @@
|
|||
name: release
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
|
||||
jobs:
|
||||
test-and-publish:
|
||||
uses: ./.github/workflows/test-and-publish.yml
|
||||
with:
|
||||
environment: production
|
||||
secrets: inherit
|
||||
|
||||
publish-website:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: amazon/aws-cli
|
||||
needs: [test-and-publish]
|
||||
environment: 'production'
|
||||
steps:
|
||||
- name: Download docs
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: docs
|
||||
path: docs/
|
||||
- name: Publish to S3
|
||||
working-directory: docs
|
||||
env:
|
||||
AWS_CF_DISTRIBUTION_ID: ${{ secrets.AWS_CF_DISTRIBUTION_ID }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
|
||||
run: |
|
||||
aws s3 sync --region eu-west-1 --delete . s3://diff2html.xyz --metadata-directive REPLACE --cache-control max-age=31557600
|
||||
aws cloudfront create-invalidation --region eu-west-1 --distribution-id $AWS_CF_DISTRIBUTION_ID --paths /index.html /demo.html /sitemap.xml /robots.txt
|
||||
148
.github/workflows/test-and-publish.yml
vendored
148
.github/workflows/test-and-publish.yml
vendored
|
|
@ -1,148 +0,0 @@
|
|||
name: test-and-publish
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
environment:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
version:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: codacy/git-version
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Fix tar access
|
||||
run: apk add --update --no-progress tar
|
||||
- name: Fix git access
|
||||
run: |
|
||||
git config --global --add safe.directory /__w/diff2html/diff2html
|
||||
- name: Get next version
|
||||
run: |
|
||||
export NEXT_VERSION="$(/bin/git-version --folder=$PWD --release-branch=master)"
|
||||
echo "Next version is ${NEXT_VERSION}"
|
||||
echo "${NEXT_VERSION}" > next-version.txt
|
||||
echo "version=${NEXT_VERSION}" >> $GITHUB_ENV
|
||||
- name: Get next npm tag name
|
||||
run: |
|
||||
if [ "${GITHUB_REF_NAME}" = "master" ]; then
|
||||
export PUBLISH_TAG="latest"
|
||||
elif [ "${GITHUB_REF_NAME}" = "next" ]; then
|
||||
export PUBLISH_TAG="next"
|
||||
else
|
||||
export PUBLISH_TAG="pr"
|
||||
fi
|
||||
echo "Next tag is ${PUBLISH_TAG}"
|
||||
echo "${PUBLISH_TAG}" > publish-tag.txt
|
||||
- name: Upload versions
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: versions
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
next-version.txt
|
||||
publish-tag.txt
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [version]
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [16.x, 18.x, 20.x, 22.x]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
- name: Log environment setup
|
||||
run: |
|
||||
node -v
|
||||
npm -v
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
- name: Build templates
|
||||
run: npm run build:templates
|
||||
- name: Build library
|
||||
run: npm run build
|
||||
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build]
|
||||
environment: ${{ inputs.environment }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Download versions
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: versions
|
||||
- name: Store version
|
||||
run: echo "version=$(cat next-version.txt)" >> $GITHUB_ENV
|
||||
- name: Configure Git
|
||||
run: |
|
||||
git config user.email "gh-actions@users.noreply.github.com"
|
||||
git config user.name "GitHub Actions"
|
||||
- name: Tag commit
|
||||
uses: tvdias/github-tagger@v0.0.1
|
||||
with:
|
||||
repo-token: '${{ secrets.GITHUB_TOKEN }}'
|
||||
tag: '${{ env.version }}'
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
node-version: '22.x'
|
||||
- name: Configure NPM version
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
run: |
|
||||
rm -f .npmrc
|
||||
touch .npmrc
|
||||
echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" >> .npmrc
|
||||
echo "registry=https://registry.npmjs.org/" >> .npmrc
|
||||
echo "access=public" >> .npmrc
|
||||
echo "save-exact=true" >> .npmrc
|
||||
- name: Version package
|
||||
run: |
|
||||
# Update version in packages to publish
|
||||
npm version $(cat next-version.txt) -m "Release version %s"
|
||||
- name: Publish to NPM
|
||||
run: npm publish --tag $(cat publish-tag.txt)
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '22.x'
|
||||
registry-url: 'https://npm.pkg.github.com'
|
||||
- name: Configure NPM version
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
rm -f .npmrc
|
||||
touch .npmrc
|
||||
echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}" >> .npmrc
|
||||
echo "@rtfpessoa:registry=https://npm.pkg.github.com/" >> .npmrc
|
||||
echo "access=public" >> .npmrc
|
||||
echo "save-exact=true" >> .npmrc
|
||||
- name: Publish to GPR
|
||||
run: |
|
||||
# HACK: Override npm package name to be able to publish in GitHub
|
||||
sed -i 's/^ "name":.*/ "name": "@rtfpessoa\/diff2html",/g' package.json
|
||||
echo "Going to publish version $(cat next-version.txt) to GitHub"
|
||||
npm publish --tag $(cat publish-tag.txt)
|
||||
# HACK: Restore npm package name
|
||||
sed -i 's/^ "name":.*/ "name": "diff2html",/g' package.json
|
||||
- name: Upload docs
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: docs
|
||||
if-no-files-found: error
|
||||
path: docs/
|
||||
11
.gitignore
vendored
11
.gitignore
vendored
|
|
@ -29,18 +29,9 @@ bower_components/
|
|||
# Terraform
|
||||
/terraform/.terraform
|
||||
|
||||
# Compiled templates
|
||||
/_target/
|
||||
/src/diff2html-templates.*
|
||||
|
||||
# Compiled website
|
||||
/docs/
|
||||
|
||||
# Bundles temporary typescript files compiled by webpack
|
||||
/bundles-out/
|
||||
|
||||
# Web bundles
|
||||
/bundles/
|
||||
# CommonJS library
|
||||
/lib/
|
||||
# ESNext library
|
||||
/lib-esm/
|
||||
|
|
|
|||
1
.husky/.gitignore
vendored
1
.husky/.gitignore
vendored
|
|
@ -1 +0,0 @@
|
|||
_
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
npm run lint:staged
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
"bracketSpacing": true,
|
||||
"htmlWhitespaceSensitivity": "css",
|
||||
"insertPragma": false,
|
||||
"jsxBracketSameLine": false,
|
||||
"jsxSingleQuote": false,
|
||||
"printWidth": 120,
|
||||
"proseWrap": "always",
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@
|
|||
|
||||
- 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 `npm run test`.
|
||||
- Before sending a pull request for a feature, be sure to run tests with `yarn test`.
|
||||
|
||||
- Use the same coding style as the rest of the codebase, most of the check can be performed with `npm run run lint`.
|
||||
- Use the same coding style as the rest of the codebase, most of the check can be performed with `yarn run lint`.
|
||||
|
||||
- Use `git rebase` (not `git merge`) to sync your work from time to time with the master branch.
|
||||
|
||||
|
|
|
|||
635
README.md
635
README.md
|
|
@ -1,20 +1,23 @@
|
|||
# diff2html
|
||||
|
||||
[](https://www.npmjs.com/package/diff2html)
|
||||
[](https://www.npmjs.com/package/diff2html)
|
||||
[](https://www.npmjs.com/package/diff2html)
|
||||
[](https://github.com/rtfpessoa/diff2html/actions/workflows/release.yml)
|
||||
[](https://www.codacy.com/app/rtfpessoa/diff2html?utm_source=github.com&utm_medium=referral&utm_content=rtfpessoa/diff2html&utm_campaign=Badge_Grade)
|
||||
[](https://www.codacy.com/app/rtfpessoa/diff2html?utm_source=github.com&utm_medium=referral&utm_content=rtfpessoa/diff2html&utm_campaign=Badge_Coverage)
|
||||
[](https://circleci.com/gh/rtfpessoa/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://www.npmjs.com/package/diff2html)
|
||||
[](https://david-dm.org/rtfpessoa/diff2html)
|
||||
[](https://david-dm.org/rtfpessoa/diff2html#info=devDependencies)
|
||||
[](https://cdnjs.com/libraries/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.
|
||||
|
||||
[](https://nodei.co/npm/diff2html/)
|
||||
|
||||
## Table of Contents
|
||||
|
||||
<!-- toc -->
|
||||
|
|
@ -23,18 +26,16 @@ diff2html generates pretty HTML diffs from git diff or unified diff output.
|
|||
- [Online Example](#online-example)
|
||||
- [Distributions](#distributions)
|
||||
- [Usage](#usage)
|
||||
- [Diff Text Input](#diff-text-input)
|
||||
- [Diff2HtmlUI Usage](#diff2htmlui-usage)
|
||||
- [Diff2HtmlUI API](#diff2htmlui-api)
|
||||
- [Diff2HtmlUI Configuration](#diff2htmlui-configuration)
|
||||
- [Diff2HtmlUI Browser](#diff2htmlui-browser)
|
||||
- [Diff2HtmlUI Examples](#diff2htmlui-examples)
|
||||
- [Diff2Html Usage](#diff2html-usage)
|
||||
- [Diff2Html API](#diff2html-api)
|
||||
- [Diff2Html Configuration](#diff2html-configuration)
|
||||
- [Diff2Html Browser](#diff2html-browser)
|
||||
- [Diff2Html NPM / Node.js Library](#diff2html-npm--nodejs-library)
|
||||
- [Diff2Html Examples](#diff2html-examples)
|
||||
- [Diff2HtmlUI Usage](#diff2htmlui-usage)
|
||||
- [Diff2HtmlUI API](#diff2htmlui-api)
|
||||
- [Diff2HtmlUI Configuration](#diff2htmlui-configuration)
|
||||
- [Diff2HtmlUI Browser](#diff2htmlui-browser)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [1. Out of memory or Slow execution](#1-out-of-memory-or-slow-execution)
|
||||
- [Contribute](#contribute)
|
||||
|
|
@ -64,64 +65,218 @@ diff2html generates pretty HTML diffs from git diff or unified diff output.
|
|||
|
||||
## Online Example
|
||||
|
||||
> Go to [diff2html](https://diff2html.xyz/demo.html)
|
||||
> Go to [diff2html](https://diff2html.xyz/)
|
||||
|
||||
## Distributions
|
||||
|
||||
- [jsdelivr CDN](https://www.jsdelivr.com/package/npm/diff2html)
|
||||
- [WebJar](http://www.webjars.org/)
|
||||
- [Node Library](https://www.npmjs.org/package/diff2html)
|
||||
- [NPM CLI](https://www.npmjs.org/package/diff2html-cli)
|
||||
- Manually use from jsdelivr or build the project:
|
||||
- Manually download and import:
|
||||
- Browser / Bundle
|
||||
- Parser and HTML Generator
|
||||
- [bundles/js/diff2html.min.js](https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html.min.js) - includes the
|
||||
diff parser and html generator
|
||||
- [bundles/js/diff2html.min.js](./bundles/js/diff2html.min.js) - includes the diff parser and html generator
|
||||
- Wrapper and helper adding syntax highlight, synchronized scroll, and other nice features
|
||||
- [bundles/js/diff2html-ui.min.js](https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js) -
|
||||
includes the wrapper of diff2html with highlight for all `highlight.js` supported languages
|
||||
- [bundles/js/diff2html-ui-slim.min.js](https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui-slim.min.js) -
|
||||
includes the wrapper of diff2html with "the most common" `highlight.js` supported languages
|
||||
- [bundles/js/diff2html-ui-base.min.js](https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui-base.min.js) -
|
||||
includes the wrapper of diff2html without including a `highlight.js` implementation. You can use it without
|
||||
syntax highlight or by passing your own implementation with the languages you prefer
|
||||
- [bundles/js/diff2html-ui.min.js](./bundles/js/diff2html-ui.min.js) - includes the wrapper of diff2html with
|
||||
highlight for all `highlight.js` supported languages
|
||||
- [bundles/js/diff2html-ui-slim.min.js](./bundles/js/diff2html-ui-slim.min.js) - includes the wrapper of diff2html
|
||||
with "the most common" `highlight.js` supported languages
|
||||
- [bundles/js/diff2html-ui-base.min.js](./bundles/js/diff2html-ui-base.min.js) - includes the wrapper of diff2html
|
||||
without including a `highlight.js` implementation. You can use it without syntax highlight or by passing your
|
||||
own implementation with the languages you prefer
|
||||
- NPM / Node.js library
|
||||
- ES5
|
||||
- [lib/diff2html.js](https://cdn.jsdelivr.net/npm/diff2html/lib/diff2html.js) - includes the diff parser and html
|
||||
generator
|
||||
- [lib/ui/js/diff2html-ui.js](https://cdn.jsdelivr.net/npm/diff2html/lib/ui/js/diff2html-ui.js) - includes the
|
||||
wrapper of diff2html with highlight for all `highlight.js` supported languages
|
||||
- [lib/ui/js/diff2html-ui-slim.js](https://cdn.jsdelivr.net/npm/diff2html/lib/ui/js/diff2html-ui-slim.js) -
|
||||
includes the wrapper of diff2html with "the most common" `highlight.js` supported languages
|
||||
- [lib/ui/js/diff2html-ui-base.js](https://cdn.jsdelivr.net/npm/diff2html/lib/ui/js/diff2html-ui-base.js)
|
||||
- [lib/diff2html.js](./lib/diff2html.js) - includes the diff parser and html generator
|
||||
- [lib/ui/js/diff2html-ui.js](./lib/ui/js/diff2html-ui.js) - includes the wrapper of diff2html with highlight for
|
||||
all `highlight.js` supported languages
|
||||
- [lib/ui/js/diff2html-ui-slim.js](./lib/ui/js/diff2html-ui-slim.js) - includes the wrapper of diff2html with "the
|
||||
most common" `highlight.js` supported languages
|
||||
- [lib/ui/js/diff2html-ui-base.js](./lib/ui/js/diff2html-ui-base.js)
|
||||
- ES6
|
||||
- [lib-esm/diff2html.js](https://cdn.jsdelivr.net/npm/diff2html/lib-esm/diff2html.js) - includes the diff parser
|
||||
and html generator
|
||||
- [lib/ui/js/diff2html-ui.js](https://cdn.jsdelivr.net/npm/diff2html/lib/ui/js/diff2html-ui.js) - includes the
|
||||
wrapper of diff2html with highlight for all `highlight.js` supported languages
|
||||
- [lib/ui/js/diff2html-ui-slim.js](https://cdn.jsdelivr.net/npm/diff2html/lib/ui/js/diff2html-ui-slim.js) -
|
||||
includes the wrapper of diff2html with "the most common" `highlight.js` supported languages
|
||||
- [lib/ui/js/diff2html-ui-base.js](https://cdn.jsdelivr.net/npm/diff2html/lib/ui/js/diff2html-ui-base.js) -
|
||||
includes the wrapper of diff2html without including a `highlight.js` implementation. You can use it without
|
||||
syntax highlight or by passing your own implementation with the languages you prefer
|
||||
- [lib-esm/diff2html.js](./lib-esm/diff2html.js) - includes the diff parser and html generator
|
||||
- [lib/ui/js/diff2html-ui.js](./lib/ui/js/diff2html-ui.js) - includes the wrapper of diff2html with highlight for
|
||||
all `highlight.js` supported languages
|
||||
- [lib/ui/js/diff2html-ui-slim.js](./lib/ui/js/diff2html-ui-slim.js) - includes the wrapper of diff2html with "the
|
||||
most common" `highlight.js` supported languages
|
||||
- [lib/ui/js/diff2html-ui-base.js](./lib/ui/js/diff2html-ui-base.js) - includes the wrapper of diff2html without
|
||||
including a `highlight.js` implementation. You can use it without syntax highlight or by passing your own
|
||||
implementation with the languages you prefer
|
||||
|
||||
## Usage
|
||||
|
||||
Diff2Html can be used in various ways as listed in the [distributions](#distributions) section. The two main ways are:
|
||||
|
||||
- [Diff2HtmlUI](#diff2htmlui-usage): using this wrapper makes it easy to inject the html in the DOM and adds some nice
|
||||
features to the diff, like syntax highlight.
|
||||
- [Diff2Html](#diff2html-usage): using the parser and html generator directly from the library gives you complete
|
||||
control about what you can do with the json or html generated.
|
||||
- [Diff2HtmlUI](#diff2htmlui-usage): using this wrapper makes it easy to inject the html in the DOM and adds some nice
|
||||
features to the diff, like syntax highlight.
|
||||
|
||||
Below you can find more details and examples about each option.
|
||||
Bellow you can find more details and exemples about each option.
|
||||
|
||||
## Diff Text Input
|
||||
## Diff2Html Usage
|
||||
|
||||
diff2html accepts the text contents of a
|
||||
[unified diff](https://www.gnu.org/software/diffutils/manual/html_node/Unified-Format.html) or the superset format git
|
||||
diff (https://git-scm.com/docs/git-diff) (not combined or word diff). To provide multiples files as input just
|
||||
concatenate the diffs (just like the output of git diff).
|
||||
To load correctly in the Browser you always need to include the stylesheet in the final HTML.
|
||||
|
||||
Import the stylesheet
|
||||
|
||||
```html
|
||||
<!-- CSS -->
|
||||
<link rel="stylesheet" type="text/css" href="bundles/css/diff2html.min.css" />
|
||||
```
|
||||
|
||||
You can also refer to it from a CDN like [CDNJS](https://cdnjs.com/libraries/diff2html).
|
||||
|
||||
### Diff2Html API
|
||||
|
||||
> JSON representation of the diff
|
||||
|
||||
```ts
|
||||
function parse(diffInput: string, configuration: Diff2HtmlConfig = {}): DiffFile[];
|
||||
```
|
||||
|
||||
> Pretty HTML representation of the diff
|
||||
|
||||
```ts
|
||||
function html(diffInput: string | DiffFile[], configuration: Diff2HtmlConfig = {}): string;
|
||||
```
|
||||
|
||||
> Check out the [docs/demo.html](./docs/demo.html) for a demo example.
|
||||
|
||||
### Diff2Html Configuration
|
||||
|
||||
The HTML output accepts a Javascript object with configuration. Possible options:
|
||||
|
||||
- `outputFormat`: the format of the output data: `'line-by-line'` or `'side-by-side'`, default is `'line-by-line'`
|
||||
- `drawFileList`: show a file list before the diff: `true` or `false`, default is `true`
|
||||
- `diffStyle`: show differences level in each line: `word` or `char`, default is `word`
|
||||
- `matching`: matching level: `'lines'` for matching lines, `'words'` for matching lines and words or `'none'`, default
|
||||
is `none`
|
||||
- `matchWordsThreshold`: similarity threshold for word matching, default is `0.25`
|
||||
- `matchingMaxComparisons`: perform at most this much comparisons for line matching a block of changes, default is
|
||||
`2500`
|
||||
- `maxLineSizeInBlockForComparison`: maximum number os characters of the bigger line in a block to apply comparison,
|
||||
default is `200`
|
||||
- `maxLineLengthHighlight`: only perform diff changes highlight if lines are smaller than this, default is `10000`
|
||||
- `renderNothingWhenEmpty`: render nothing if the diff shows no change in its comparison: `true` or `false`, default is
|
||||
`false`
|
||||
- `compiledTemplates`: object with previously compiled templates to replace parts of the html
|
||||
- `rawTemplates`: object with raw not compiled templates to replace parts of the html
|
||||
> For more information regarding the possible templates look into
|
||||
> [src/templates](https://github.com/rtfpessoa/diff2html/tree/master/src/templates)
|
||||
|
||||
### Diff2Html Browser
|
||||
|
||||
Import the stylesheet and the library code
|
||||
|
||||
```html
|
||||
<!-- CSS -->
|
||||
<link rel="stylesheet" type="text/css" href="bundles/css/diff2html.min.css" />
|
||||
|
||||
<!-- Javascripts -->
|
||||
<script type="text/javascript" src="bundles/js/diff2html.min.js"></script>
|
||||
```
|
||||
|
||||
It will now be available as a global variable named `Diff2Html`.
|
||||
|
||||
```js
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
var diffHtml = global.Diff2Html.html('<Unified Diff String>', {
|
||||
drawFileList: true,
|
||||
matching: 'lines',
|
||||
outputFormat: 'side-by-side',
|
||||
});
|
||||
document.getElementById('destination-elem-id').innerHTML = diffHtml;
|
||||
});
|
||||
```
|
||||
|
||||
### Diff2Html NPM / Node.js Library
|
||||
|
||||
```js
|
||||
const Diff2html = require('diff2html');
|
||||
const diffJson = Diff2html.parse('<Unified Diff String>');
|
||||
const diffHtml = Diff2html.html(diffJson, { drawFileList: true });
|
||||
document.getElementById('destination-elem-id').innerHTML = diffHtml;
|
||||
```
|
||||
|
||||
### Diff2Html Examples
|
||||
|
||||
#### Diff2Html Angular Example
|
||||
|
||||
- Typescript
|
||||
|
||||
```typescript
|
||||
import * as Diff2Html from 'diff2html';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
|
||||
export class AppDiffComponent implements OnInit {
|
||||
outputHtml: string;
|
||||
constructor() {
|
||||
this.init();
|
||||
}
|
||||
|
||||
ngOnInit() {}
|
||||
|
||||
init() {
|
||||
let strInput =
|
||||
'--- a/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n+++ b/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (\n \n // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n \n+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n+\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n+\tn = int(r0)\n+\tif e1 != 0 {\n+\t\terr = errnoErr(e1)\n+\t}\n+\treturn\n+}\n+\n+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n+\n func read(fd int, p []byte) (n int, err error) {\n \tvar _p0 unsafe.Pointer\n \tif len(p) > 0 {\n';
|
||||
let outputHtml = Diff2Html.html(strInput, { drawFileList: true, matching: 'lines' });
|
||||
this.outputHtml = outputHtml;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- HTML
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>diff2html</title>
|
||||
</head>
|
||||
<body>
|
||||
<div [innerHtml]="outputHtml"></div>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
- `.angular-cli.json` - Add styles
|
||||
|
||||
```json
|
||||
"styles": [
|
||||
"diff2html.min.css"
|
||||
]
|
||||
```
|
||||
|
||||
#### Diff2Html Vue.js Example
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<div v-html="prettyHtml" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import * as Diff2Html from 'diff2html';
|
||||
import 'diff2html/bundles/css/diff2html.min.css';
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
diffs:
|
||||
'--- a/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n+++ b/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (\n \n // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n \n+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n+\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n+\tn = int(r0)\n+\tif e1 != 0 {\n+\t\terr = errnoErr(e1)\n+\t}\n+\treturn\n+}\n+\n+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n+\n func read(fd int, p []byte) (n int, err error) {\n \tvar _p0 unsafe.Pointer\n \tif len(p) > 0 {\n',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
prettyHtml() {
|
||||
return Diff2Html.html(this.diffs, {
|
||||
drawFileList: true,
|
||||
matching: 'lines',
|
||||
outputFormat: 'side-by-side',
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
```
|
||||
|
||||
## Diff2HtmlUI Usage
|
||||
|
||||
|
|
@ -153,18 +308,21 @@ draw(): void
|
|||
synchronisedScroll(): void
|
||||
fileListToggle(startVisible: boolean): void
|
||||
highlightCode(): void
|
||||
stickyFileHeaders(): void
|
||||
smartSelection(): void
|
||||
```
|
||||
|
||||
> Check out the [docs/demo.html](./docs/demo.html) for a demo example.
|
||||
|
||||
### Diff2HtmlUI Configuration
|
||||
|
||||
- `synchronisedScroll`: scroll both panes in side-by-side mode: `true` or `false`, default is `true`
|
||||
- `highlight`: syntax highlight the code on the diff: `true` or `false`, default is `true`
|
||||
- `fileListToggle`: allow the file summary list to be toggled: `true` or `false`, default is `true`
|
||||
- `fileListStartVisible`: choose if the file summary list starts visible: `true` or `false`, default is `false`
|
||||
- `fileContentToggle`: allow each file contents to be toggled: `true` or `false`, default is `true`
|
||||
- `stickyFileHeaders`: make file headers sticky: `true` or `false`, default is `true`
|
||||
- [All the options](#diff2html-configuration) from Diff2Html are also valid configurations in Diff2HtmlUI
|
||||
- `smartSelection`: allow selection of the code without including line numbers of line prefixes: `true` or `false`,
|
||||
default is `true`
|
||||
|
||||
> NOTE: All the options from Diff2Html are also valid configurations in Diff2HtmlUI
|
||||
|
||||
### Diff2HtmlUI Browser
|
||||
|
||||
|
|
@ -172,10 +330,10 @@ stickyFileHeaders(): void
|
|||
|
||||
```html
|
||||
<!-- 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="bundles/css/diff2html.min.css" />
|
||||
|
||||
<!-- Javascripts -->
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js"></script>
|
||||
<script type="text/javascript" src="bundles/js/diff2html-ui.min.js"></script>
|
||||
```
|
||||
|
||||
#### Init
|
||||
|
|
@ -197,15 +355,13 @@ diff2htmlUi.draw();
|
|||
|
||||
#### Syntax Highlight
|
||||
|
||||
**NOTE:** The highlight.js css should come before the diff2html css
|
||||
|
||||
```html
|
||||
<!-- Stylesheet -->
|
||||
<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" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/styles/github.min.css" />
|
||||
<link rel="stylesheet" type="text/css" href="bundles/css/diff2html.min.css" />
|
||||
|
||||
<!-- Javascripts -->
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js"></script>
|
||||
<script type="text/javascript" src="bundles/js/diff2html-ui.min.js"></script>
|
||||
```
|
||||
|
||||
> Pass the option `highlight` with value true or invoke `diff2htmlUi.highlightCode()` after `diff2htmlUi.draw()`.
|
||||
|
|
@ -213,42 +369,27 @@ diff2htmlUi.draw();
|
|||
```js
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const diffString = `diff --git a/sample.js b/sample.js
|
||||
index 0000001..0ddf2ba
|
||||
--- a/sample.js
|
||||
+++ b/sample.js
|
||||
@@ -1 +1 @@
|
||||
-console.log("Hello World!")
|
||||
+console.log("Hello from Diff2Html!")`;
|
||||
index 0000001..0ddf2ba
|
||||
--- a/sample.js
|
||||
+++ b/sample.js
|
||||
@@ -1 +1 @@
|
||||
-console.log("Hello World!")
|
||||
+console.log("Hello from Diff2Html!")`;
|
||||
const targetElement = document.getElementById('myDiffElement');
|
||||
const configuration = { drawFileList: true, matching: 'lines', highlight: true };
|
||||
const configuration = { inputFormat: 'json', drawFileList: true, matching: 'lines', highlight: true };
|
||||
const diff2htmlUi = new Diff2HtmlUI(targetElement, diffString, configuration);
|
||||
diff2htmlUi.draw();
|
||||
diff2htmlUi.highlightCode();
|
||||
});
|
||||
```
|
||||
|
||||
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
|
||||
|
||||
> Add the dependencies.
|
||||
|
||||
```html
|
||||
<!-- Javascripts -->
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js"></script>
|
||||
<script type="text/javascript" src="bundles/js/diff2html-ui.min.js"></script>
|
||||
```
|
||||
|
||||
> Invoke the Diff2HtmlUI helper Pass the option `fileListToggle` with value true or invoke
|
||||
|
|
@ -263,263 +404,6 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||
});
|
||||
```
|
||||
|
||||
### Diff2HtmlUI Examples
|
||||
|
||||
#### Example with plain HTML+CSS+JS
|
||||
|
||||
```html
|
||||
<!doctype html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<!-- Make sure to load the highlight.js CSS file before the Diff2Html CSS file -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.7.1/styles/github.min.css" />
|
||||
<link
|
||||
rel="stylesheet"
|
||||
type="text/css"
|
||||
href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css"
|
||||
/>
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js"></script>
|
||||
</head>
|
||||
<script>
|
||||
const diffString = `diff --git a/sample.js b/sample.js
|
||||
index 0000001..0ddf2ba
|
||||
--- a/sample.js
|
||||
+++ b/sample.js
|
||||
@@ -1 +1 @@
|
||||
-console.log("Hello World!")
|
||||
+console.log("Hello from Diff2Html!")`;
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
var targetElement = document.getElementById('myDiffElement');
|
||||
var configuration = {
|
||||
drawFileList: true,
|
||||
fileListToggle: false,
|
||||
fileListStartVisible: false,
|
||||
fileContentToggle: false,
|
||||
matching: 'lines',
|
||||
outputFormat: 'side-by-side',
|
||||
synchronisedScroll: true,
|
||||
highlight: true,
|
||||
renderNothingWhenEmpty: false,
|
||||
};
|
||||
var diff2htmlUi = new Diff2HtmlUI(targetElement, diffString, configuration);
|
||||
diff2htmlUi.draw();
|
||||
diff2htmlUi.highlightCode();
|
||||
});
|
||||
</script>
|
||||
<body>
|
||||
<div id="myDiffElement"></div>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
#### StimulusJS with TypeScript
|
||||
|
||||
```ts
|
||||
import { Controller } from '@hotwired/stimulus';
|
||||
|
||||
import { Diff2HtmlUI, Diff2HtmlUIConfig } from 'diff2html/lib/ui/js/diff2html-ui-slim.js';
|
||||
|
||||
// Requires `npm install highlight.js`
|
||||
import 'highlight.js/styles/github.css';
|
||||
import 'diff2html/bundles/css/diff2html.min.css';
|
||||
|
||||
export default class extends Controller {
|
||||
connect(): void {
|
||||
const diff2htmlUi = new Diff2HtmlUI(this.diffElement, this.unifiedDiff, this.diffConfiguration);
|
||||
|
||||
diff2htmlUi.draw();
|
||||
}
|
||||
|
||||
get unifiedDiff(): string {
|
||||
return this.data.get('unifiedDiff') || '';
|
||||
}
|
||||
|
||||
get diffElement(): HTMLElement {
|
||||
return this.element as HTMLElement;
|
||||
}
|
||||
|
||||
get diffConfiguration(): Diff2HtmlUIConfig {
|
||||
return {
|
||||
drawFileList: true,
|
||||
matching: 'lines',
|
||||
};
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Diff2Html Usage
|
||||
|
||||
### Diff2Html API
|
||||
|
||||
> JSON representation of the diff
|
||||
|
||||
```ts
|
||||
function parse(diffInput: string, configuration: Diff2HtmlConfig = {}): DiffFile[];
|
||||
```
|
||||
|
||||
> Pretty HTML representation of the diff
|
||||
|
||||
```ts
|
||||
function html(diffInput: string | DiffFile[], configuration: Diff2HtmlConfig = {}): string;
|
||||
```
|
||||
|
||||
### Diff2Html Configuration
|
||||
|
||||
The HTML output accepts a Javascript object with configuration. Possible options:
|
||||
|
||||
- `outputFormat`: the format of the output data: `'line-by-line'` or `'side-by-side'`, default is `'line-by-line'`
|
||||
- `drawFileList`: show a file list before the diff: `true` or `false`, default is `true`
|
||||
- `srcPrefix`: add a prefix to all source (before changes) filepaths, default is `''`. Should match the prefix used when
|
||||
[generating the diff](https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---src-prefixltprefixgt).
|
||||
- `dstPrefix`: add a prefix to all destination (after changes) filepaths, default is `''`. Should match the prefix used
|
||||
when [generating the diff](https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---dst-prefixltprefixgt)
|
||||
- `diffMaxChanges`: number of changed lines after which a file diff is deemed as too big and not displayed, default is
|
||||
`undefined`
|
||||
- `diffMaxLineLength`: number of characters in a diff line after which a file diff is deemed as too big and not
|
||||
displayed, default is `undefined`
|
||||
- `diffTooBigMessage`: function allowing to customize the message in case of file diff too big (if `diffMaxChanges` or
|
||||
`diffMaxLineLength` is set). Will be given a file index as a number and should return a string.
|
||||
- `matching`: matching level: `'lines'` for matching lines, `'words'` for matching lines and words or `'none'`, default
|
||||
is `none`
|
||||
- `matchWordsThreshold`: similarity threshold for word matching, default is `0.25`
|
||||
- `maxLineLengthHighlight`: only perform diff changes highlight if lines are smaller than this, default is `10000`
|
||||
- `diffStyle`: show differences level in each line: `'word'` or `'char'`, default is `'word'`
|
||||
- `renderNothingWhenEmpty`: render nothing if the diff shows no change in its comparison: `true` or `false`, default is
|
||||
`false`
|
||||
- `matchingMaxComparisons`: perform at most this much comparisons for line matching a block of changes, default is
|
||||
`2500`
|
||||
- `maxLineSizeInBlockForComparison`: maximum number of characters of the bigger line in a block to apply comparison,
|
||||
default is `200`
|
||||
- `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:
|
||||
`{ "tag-file-changed": Hogan.compile("<span class="d2h-tag d2h-changed d2h-changed-tag">MODIFIED</span>") }`
|
||||
- `rawTemplates`: object (string values) with raw not compiled templates to replace parts of the html, default is `{}`.
|
||||
For example: `{ "tag-file-changed": "<span class="d2h-tag d2h-changed d2h-changed-tag">MODIFIED</span>" }`
|
||||
> For more information regarding the possible templates look into
|
||||
> [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
|
||||
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
|
||||
|
||||
Import the stylesheet and the library code.
|
||||
|
||||
To load correctly in the Browser you need to include the stylesheet in the final HTML.
|
||||
|
||||
```html
|
||||
<!-- CSS -->
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css" />
|
||||
|
||||
<!-- Javascripts -->
|
||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html.min.js"></script>
|
||||
```
|
||||
|
||||
It will now be available as a global variable named `Diff2Html`.
|
||||
|
||||
```js
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
var diffHtml = Diff2Html.html('<Unified Diff String>', {
|
||||
drawFileList: true,
|
||||
matching: 'lines',
|
||||
outputFormat: 'side-by-side',
|
||||
});
|
||||
document.getElementById('destination-elem-id').innerHTML = diffHtml;
|
||||
});
|
||||
```
|
||||
|
||||
### Diff2Html NPM / Node.js Library
|
||||
|
||||
```js
|
||||
const Diff2html = require('diff2html');
|
||||
const diffJson = Diff2html.parse('<Unified Diff String>');
|
||||
const diffHtml = Diff2html.html(diffJson, { drawFileList: true });
|
||||
console.log(diffHtml);
|
||||
```
|
||||
|
||||
### Diff2Html Examples
|
||||
|
||||
#### Example with Angular
|
||||
|
||||
- Typescript
|
||||
|
||||
```typescript
|
||||
import * as Diff2Html from 'diff2html';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
|
||||
export class AppDiffComponent implements OnInit {
|
||||
outputHtml: string;
|
||||
constructor() {
|
||||
this.init();
|
||||
}
|
||||
|
||||
ngOnInit() {}
|
||||
|
||||
init() {
|
||||
let strInput =
|
||||
'--- a/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n+++ b/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (\n \n // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n \n+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n+\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n+\tn = int(r0)\n+\tif e1 != 0 {\n+\t\terr = errnoErr(e1)\n+\t}\n+\treturn\n+}\n+\n+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n+\n func read(fd int, p []byte) (n int, err error) {\n \tvar _p0 unsafe.Pointer\n \tif len(p) > 0 {\n';
|
||||
let outputHtml = Diff2Html.html(strInput, { drawFileList: true, matching: 'lines' });
|
||||
this.outputHtml = outputHtml;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- HTML
|
||||
|
||||
```html
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>diff2html</title>
|
||||
</head>
|
||||
<body>
|
||||
<div [innerHtml]="outputHtml"></div>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
- `.angular-cli.json` - Add styles
|
||||
|
||||
```json
|
||||
"styles": [
|
||||
"diff2html.min.css"
|
||||
]
|
||||
```
|
||||
|
||||
#### Example with Vue.js
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<div v-html="prettyHtml" />
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import * as Diff2Html from 'diff2html';
|
||||
import 'diff2html/bundles/css/diff2html.min.css';
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
diffs:
|
||||
'--- a/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n+++ b/server/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go\n@@ -1035,6 +1035,17 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (\n \n // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n \n+func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n+\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n+\tn = int(r0)\n+\tif e1 != 0 {\n+\t\terr = errnoErr(e1)\n+\t}\n+\treturn\n+}\n+\n+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n+\n func read(fd int, p []byte) (n int, err error) {\n \tvar _p0 unsafe.Pointer\n \tif len(p) > 0 {\n',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
prettyHtml() {
|
||||
return Diff2Html.html(this.diffs, {
|
||||
drawFileList: true,
|
||||
matching: 'lines',
|
||||
outputFormat: 'side-by-side',
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### 1. Out of memory or Slow execution
|
||||
|
|
@ -547,53 +431,42 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center"><a href="https://rtfpessoa.xyz"><img src="https://avatars0.githubusercontent.com/u/902384?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rodrigo Fernandes</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=rtfpessoa" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/stockmind"><img src="https://avatars3.githubusercontent.com/u/5653847?v=4?s=100" width="100px;" alt=""/><br /><sub><b>stockmind</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=stockmind" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/lantian"><img src="https://avatars3.githubusercontent.com/u/535545?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ivan Vorontsov</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=lantian" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://www.nick-brewer.com"><img src="https://avatars1.githubusercontent.com/u/129300?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nick Brewer</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=brewern" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://heyitsmattwade.com"><img src="https://avatars0.githubusercontent.com/u/8504000?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matt Wade</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Aromellem" title="Bug reports">🐛</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=romellem" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://mrfyda.github.io"><img src="https://avatars1.githubusercontent.com/u/593860?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rafael Cortês</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=mrfyda" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/nmatpt"><img src="https://avatars2.githubusercontent.com/u/5034733?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nuno Teixeira</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=nmatpt" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://rtfpessoa.xyz"><img src="https://avatars0.githubusercontent.com/u/902384?v=4" width="100px;" alt=""/><br /><sub><b>Rodrigo Fernandes</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=rtfpessoa" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/stockmind"><img src="https://avatars3.githubusercontent.com/u/5653847?v=4" width="100px;" alt=""/><br /><sub><b>stockmind</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=stockmind" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/lantian"><img src="https://avatars3.githubusercontent.com/u/535545?v=4" width="100px;" alt=""/><br /><sub><b>Ivan Vorontsov</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=lantian" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://www.nick-brewer.com"><img src="https://avatars1.githubusercontent.com/u/129300?v=4" width="100px;" alt=""/><br /><sub><b>Nick Brewer</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=brewern" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://heyitsmattwade.com"><img src="https://avatars0.githubusercontent.com/u/8504000?v=4" width="100px;" alt=""/><br /><sub><b>Matt Wade</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Aromellem" title="Bug reports">🐛</a></td>
|
||||
<td align="center"><a href="http://mrfyda.github.io"><img src="https://avatars1.githubusercontent.com/u/593860?v=4" width="100px;" alt=""/><br /><sub><b>Rafael Cortês</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=mrfyda" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/nmatpt"><img src="https://avatars2.githubusercontent.com/u/5034733?v=4" width="100px;" alt=""/><br /><sub><b>Nuno Teixeira</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=nmatpt" title="Code">💻</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://saino.me/"><img src="https://avatars0.githubusercontent.com/u/1567423?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Koki Oyatsu</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Akaishuu0123" title="Bug reports">🐛</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=kaishuu0123" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://www.jamesmonger.com"><img src="https://avatars2.githubusercontent.com/u/2037007?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James Monger</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=Jameskmonger" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="http://wesssel.github.io/"><img src="https://avatars2.githubusercontent.com/u/7767299?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Wessel van der Pal</b></sub></a><br /><a href="#security-wesssel" title="Security">🛡️</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=wesssel" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://jung-kim.github.io"><img src="https://avatars2.githubusercontent.com/u/5281068?v=4?s=100" width="100px;" alt=""/><br /><sub><b>jk-kim</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=jung-kim" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/sss0791"><img src="https://avatars1.githubusercontent.com/u/1446970?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sergey Semenov</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Asss0791" title="Bug reports">🐛</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=sss0791" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://researcher.watson.ibm.com/researcher/view.php?person=us-nickm"><img src="https://avatars3.githubusercontent.com/u/4741620?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nick Mitchell</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Astarpit" title="Bug reports">🐛</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=starpit" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/samiraguiar"><img src="https://avatars0.githubusercontent.com/u/13439135?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Samir Aguiar</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=samiraguiar" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://saino.me/"><img src="https://avatars0.githubusercontent.com/u/1567423?v=4" width="100px;" alt=""/><br /><sub><b>Koki Oyatsu</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Akaishuu0123" title="Bug reports">🐛</a></td>
|
||||
<td align="center"><a href="http://www.jamesmonger.com"><img src="https://avatars2.githubusercontent.com/u/2037007?v=4" width="100px;" alt=""/><br /><sub><b>James Monger</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=Jameskmonger" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="http://wesssel.github.io/"><img src="https://avatars2.githubusercontent.com/u/7767299?v=4" width="100px;" alt=""/><br /><sub><b>Wessel van der Pal</b></sub></a><br /><a href="#security-wesssel" title="Security">🛡️</a></td>
|
||||
<td align="center"><a href="https://jung-kim.github.io"><img src="https://avatars2.githubusercontent.com/u/5281068?v=4" width="100px;" alt=""/><br /><sub><b>jk-kim</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=jung-kim" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/sss0791"><img src="https://avatars1.githubusercontent.com/u/1446970?v=4" width="100px;" alt=""/><br /><sub><b>Sergey Semenov</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Asss0791" title="Bug reports">🐛</a></td>
|
||||
<td align="center"><a href="http://researcher.watson.ibm.com/researcher/view.php?person=us-nickm"><img src="https://avatars3.githubusercontent.com/u/4741620?v=4" width="100px;" alt=""/><br /><sub><b>Nick Mitchell</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Astarpit" title="Bug reports">🐛</a></td>
|
||||
<td align="center"><a href="https://github.com/samiraguiar"><img src="https://avatars0.githubusercontent.com/u/13439135?v=4" width="100px;" alt=""/><br /><sub><b>Samir Aguiar</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=samiraguiar" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://twitter.com/pubkeypubkey"><img src="https://avatars3.githubusercontent.com/u/8926560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>pubkey</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=pubkey" title="Documentation">📖</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=pubkey" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/iliyaZelenko"><img src="https://avatars1.githubusercontent.com/u/13103045?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Илья</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=iliyaZelenko" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://akr.am"><img src="https://avatars0.githubusercontent.com/u/1823771?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mohamed Akram</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Amohd-akram" title="Bug reports">🐛</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=mohd-akram" title="Documentation">📖</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=mohd-akram" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/emarcotte"><img src="https://avatars0.githubusercontent.com/u/249390?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Eugene Marcotte</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=emarcotte" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://twitter.com/dimasabanin"><img src="https://avatars0.githubusercontent.com/u/8316?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dima Sabanin</b></sub></a><br /><a href="#maintenance-dsabanin" title="Maintenance">🚧</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=dsabanin" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/benabbottnz"><img src="https://avatars2.githubusercontent.com/u/2616473?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ben Abbott</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=benabbottnz" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="http://webminer.js.org"><img src="https://avatars1.githubusercontent.com/u/2196373?v=4?s=100" width="100px;" alt=""/><br /><sub><b>弘树@阿里</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Adickeylth" title="Bug reports">🐛</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=dickeylth" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://twitter.com/pubkeypubkey"><img src="https://avatars3.githubusercontent.com/u/8926560?v=4" width="100px;" alt=""/><br /><sub><b>pubkey</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=pubkey" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/iliyaZelenko"><img src="https://avatars1.githubusercontent.com/u/13103045?v=4" width="100px;" alt=""/><br /><sub><b>Илья</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=iliyaZelenko" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://akr.am"><img src="https://avatars0.githubusercontent.com/u/1823771?v=4" width="100px;" alt=""/><br /><sub><b>Mohamed Akram</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Amohd-akram" title="Bug reports">🐛</a></td>
|
||||
<td align="center"><a href="https://github.com/emarcotte"><img src="https://avatars0.githubusercontent.com/u/249390?v=4" width="100px;" alt=""/><br /><sub><b>Eugene Marcotte</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=emarcotte" title="Code">💻</a></td>
|
||||
<td align="center"><a href="http://twitter.com/dimasabanin"><img src="https://avatars0.githubusercontent.com/u/8316?v=4" width="100px;" alt=""/><br /><sub><b>Dima Sabanin</b></sub></a><br /><a href="#maintenance-dsabanin" title="Maintenance">🚧</a></td>
|
||||
<td align="center"><a href="https://github.com/benabbottnz"><img src="https://avatars2.githubusercontent.com/u/2616473?v=4" width="100px;" alt=""/><br /><sub><b>Ben Abbott</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=benabbottnz" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="http://webminer.js.org"><img src="https://avatars1.githubusercontent.com/u/2196373?v=4" width="100px;" alt=""/><br /><sub><b>弘树@阿里</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Adickeylth" title="Bug reports">🐛</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://github.com/Rantanen"><img src="https://avatars0.githubusercontent.com/u/385385?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mikko Rantanen</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3ARantanen" title="Bug reports">🐛</a></td>
|
||||
<td align="center"><a href="https://github.com/extend1994"><img src="https://avatars2.githubusercontent.com/u/13430892?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ann</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=extend1994" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/escitalopram"><img src="https://avatars0.githubusercontent.com/u/1155220?v=4?s=100" width="100px;" alt=""/><br /><sub><b>escitalopram</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=escitalopram" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/apps/dependabot"><img src="https://avatars0.githubusercontent.com/in/29110?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dependabot[bot]</b></sub></a><br /><a href="#security-dependabot[bot]" title="Security">🛡️</a> <a href="#maintenance-dependabot[bot]" title="Maintenance">🚧</a></td>
|
||||
<td align="center"><a href="http://www.joshuakgoldberg.com"><img src="https://avatars1.githubusercontent.com/u/3335181?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Josh Goldberg</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=JoshuaKGoldberg" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/apeckham"><img src="https://avatars.githubusercontent.com/u/14110?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aaron</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=apeckham" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/pgrimaud"><img src="https://avatars.githubusercontent.com/u/1866496?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Pierre Grimaud</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=pgrimaud" title="Documentation">📖</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><a href="https://domdomegg.github.io/"><img src="https://avatars.githubusercontent.com/u/4953590?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Adam Jones</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=domdomegg" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/charguer"><img src="https://avatars.githubusercontent.com/u/1830652?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Arthur Charguéraud</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=charguer" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://twitter.com/pierrci"><img src="https://avatars.githubusercontent.com/u/5020707?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Pierric Cistac</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=Pierrci" title="Documentation">📖</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=Pierrci" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/xlith"><img src="https://avatars.githubusercontent.com/u/510560?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Civan Yavuzşen</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=xlith" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/timgates42"><img src="https://avatars.githubusercontent.com/u/47873678?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Gates</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=timgates42" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/campersau"><img src="https://avatars.githubusercontent.com/u/4009570?v=4?s=100" width="100px;" alt=""/><br /><sub><b>campersau</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=campersau" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/apps/dependabot-preview"><img src="https://avatars.githubusercontent.com/in/2141?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dependabot-preview[bot]</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=dependabot-preview[bot]" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/Rantanen"><img src="https://avatars0.githubusercontent.com/u/385385?v=4" width="100px;" alt=""/><br /><sub><b>Mikko Rantanen</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3ARantanen" title="Bug reports">🐛</a></td>
|
||||
<td align="center"><a href="https://github.com/extend1994"><img src="https://avatars2.githubusercontent.com/u/13430892?v=4" width="100px;" alt=""/><br /><sub><b>Ann</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=extend1994" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="https://github.com/escitalopram"><img src="https://avatars0.githubusercontent.com/u/1155220?v=4" width="100px;" alt=""/><br /><sub><b>escitalopram</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Aescitalopram" title="Bug reports">🐛</a> <a href="https://github.com/rtfpessoa/diff2html/commits?author=escitalopram" title="Code">💻</a></td>
|
||||
<td align="center"><a href="https://github.com/apps/dependabot"><img src="https://avatars0.githubusercontent.com/in/29110?v=4" width="100px;" alt=""/><br /><sub><b>dependabot[bot]</b></sub></a><br /><a href="#security-dependabot[bot]" title="Security">🛡️</a> <a href="#maintenance-dependabot[bot]" title="Maintenance">🚧</a></td>
|
||||
<td align="center"><a href="http://www.joshuakgoldberg.com"><img src="https://avatars1.githubusercontent.com/u/3335181?v=4" width="100px;" alt=""/><br /><sub><b>Josh Goldberg</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=JoshuaKGoldberg" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- markdownlint-enable -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
|
|
|||
|
|
@ -1,77 +0,0 @@
|
|||
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,5 +19,4 @@ module.exports = {
|
|||
lines: 93,
|
||||
},
|
||||
},
|
||||
prettierPath: require.resolve('prettier-2'),
|
||||
};
|
||||
|
|
|
|||
18121
package-lock.json
generated
18121
package-lock.json
generated
File diff suppressed because it is too large
Load diff
171
package.json
171
package.json
|
|
@ -32,42 +32,46 @@
|
|||
"url": "https://www.github.com/rtfpessoa/diff2html/issues"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
"node": ">=10.13"
|
||||
},
|
||||
"scripts": {
|
||||
"lint:staged": "lint-staged",
|
||||
"lint:check": "eslint",
|
||||
"lint:fix": "eslint --fix",
|
||||
"eslint": "eslint --ignore-path .gitignore \"**/*.{js,jsx,ts,tsx,json}\"",
|
||||
"lint:check": "yarn run eslint",
|
||||
"lint:fix": "yarn run eslint --fix",
|
||||
"prettier": "prettier --ignore-path .gitignore '**/*.+(js|jsx|ts|tsx|json|css|html|md|mdx)'",
|
||||
"format:check": "npm run prettier --check",
|
||||
"format:fix": "npm run prettier --write",
|
||||
"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:commonjs": "rm -rf lib; tsc -p tsconfig.json -m CommonJS --outDir lib",
|
||||
"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",
|
||||
"format:check": "yarn run prettier --check",
|
||||
"format:fix": "yarn 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:es5": "rm -rf lib; tsc -p tsconfig.json --outDir lib",
|
||||
"build:esm": "rm -rf lib-esm; tsc -p tsconfig.json -m es6 --outDir lib-esm",
|
||||
"build:bundles": "rm -rf ./bundles/js; webpack ---display-reasons --display-modules --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: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",
|
||||
"gen": "npm run gen:toc",
|
||||
"build:website": "rm -rf docs; webpack ---display-reasons --display-modules --mode production --config webpack.website.ts",
|
||||
"gen": "yarn run gen:toc",
|
||||
"gen:toc-base": "markdown-toc --maxdepth 3 --bullets='-' -i",
|
||||
"gen:toc": "npm run gen:toc-base README.md",
|
||||
"gen:toc": "yarn run gen:toc-base README.md",
|
||||
"test": "is-ci 'test:coverage' 'test:watch'",
|
||||
"test:coverage": "jest --coverage",
|
||||
"test:watch": "jest --watch",
|
||||
"test:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand --watch",
|
||||
"coverage:open": "npm run test:coverage && open ./coverage/index.html",
|
||||
"coverage:push": "curl -Ls https://coverage.codacy.com/get.sh | bash",
|
||||
"validate": "npm run build:templates && npm run format:check && npm run lint:check && npm run build && npm run test:coverage",
|
||||
"fix": "npm run format:fix && npm run lint:fix",
|
||||
"start": "npm run start:website",
|
||||
"start:website": "webpack serve --mode development --config webpack.website.ts",
|
||||
"preversion": "npm run validate",
|
||||
"version": "git add -A package.json",
|
||||
"prepare": "husky"
|
||||
"coverage:open": "yarn run test:coverage && open ./coverage/index.html",
|
||||
"coverage:push": "cat ./coverage/lcov.info | codacy-coverage",
|
||||
"validate": "yarn run build:templates && yarn run format:check && yarn run lint:check && yarn run build && yarn run test:coverage",
|
||||
"fix": "yarn run format:fix && yarn run lint:fix",
|
||||
"start": "yarn run start:website",
|
||||
"start:website": "webpack-dev-server --mode development --config webpack.website.ts",
|
||||
"preversion": "yarn run validate",
|
||||
"version": "git add -A package.json"
|
||||
},
|
||||
"main": "./lib/diff2html.js",
|
||||
"module": "./lib-esm/diff2html.js",
|
||||
"types": "./lib/diff2html.d.ts",
|
||||
"husky": {
|
||||
"hooks": {
|
||||
"pre-commit": "lint-staged"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
"**/*.+(js|jsx|ts|tsx|json)": [
|
||||
"prettier --write",
|
||||
|
|
@ -77,79 +81,78 @@
|
|||
"prettier --write"
|
||||
],
|
||||
"README.md": [
|
||||
"npm run gen:toc-base"
|
||||
"yarn run gen:toc-base"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"diff": "^7.0.0",
|
||||
"diff": "4.0.2",
|
||||
"hogan.js": "3.0.2"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"highlight.js": "11.9.0"
|
||||
"highlight.js": "9.18.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"prettier-2": "npm:prettier@^2",
|
||||
"@eslint/js": "^9.17.0",
|
||||
"@eslint/json": "^0.9.0",
|
||||
"@types/diff": "^6.0.0",
|
||||
"@types/hogan.js": "3.0.5",
|
||||
"@types/jest": "^29.5.14",
|
||||
"@types/node": "^22.10.2",
|
||||
"@types/nopt": "3.0.32",
|
||||
"all-contributors-cli": "^6.24.0",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"bulma": "^1.0.2",
|
||||
"clipboard": "2.0.11",
|
||||
"copy-webpack-plugin": "^12.0.2",
|
||||
"css-loader": "^7.1.2",
|
||||
"cssnano": "^7.0.6",
|
||||
"eslint": "^9.17.0",
|
||||
"eslint-plugin-jest": "28.10.0",
|
||||
"eslint-plugin-promise": "^7.2.1",
|
||||
"file-loader": "6.2.0",
|
||||
"globals": "^15.14.0",
|
||||
"handlebars": "4.7.8",
|
||||
"handlebars-loader": "1.7.3",
|
||||
"html-webpack-plugin": "^5.6.3",
|
||||
"husky": "^9.1.7",
|
||||
"image-webpack-loader": "8.1.0",
|
||||
"is-ci-cli": "2.2.0",
|
||||
"jest": "29.7.0",
|
||||
"lint-staged": "^15.2.11",
|
||||
"@types/clipboard": "2.0.1",
|
||||
"@types/copy-webpack-plugin": "5.0.0",
|
||||
"@types/diff": "4.0.2",
|
||||
"@types/highlight.js": "9.12.3",
|
||||
"@types/hogan.js": "3.0.0",
|
||||
"@types/html-webpack-plugin": "3.2.2",
|
||||
"@types/jest": "25.1.1",
|
||||
"@types/mini-css-extract-plugin": "0.9.0",
|
||||
"@types/mkdirp": "0.5.2",
|
||||
"@types/node": "13.7.0",
|
||||
"@types/nopt": "3.0.29",
|
||||
"@types/webpack": "4.41.5",
|
||||
"@typescript-eslint/eslint-plugin": "2.19.0",
|
||||
"@typescript-eslint/parser": "2.19.0",
|
||||
"autoprefixer": "9.7.4",
|
||||
"bulma": "^0.8.0",
|
||||
"clipboard": "2.0.4",
|
||||
"codacy-coverage": "3.4.0",
|
||||
"copy-webpack-plugin": "5.1.1",
|
||||
"css-loader": "3.4.2",
|
||||
"cssnano": "4.1.10",
|
||||
"eslint": "6.8.0",
|
||||
"eslint-config-prettier": "6.10.0",
|
||||
"eslint-plugin-import": "2.20.1",
|
||||
"eslint-plugin-jest": "23.6.0",
|
||||
"eslint-plugin-json": "2.0.1",
|
||||
"eslint-plugin-node": "11.0.0",
|
||||
"eslint-plugin-optimize-regex": "1.1.7",
|
||||
"eslint-plugin-promise": "4.2.1",
|
||||
"eslint-plugin-sonarjs": "0.5.0",
|
||||
"file-loader": "5.0.2",
|
||||
"handlebars": "4.7.3",
|
||||
"handlebars-loader": "1.7.1",
|
||||
"html-webpack-plugin": "3.2.0",
|
||||
"husky": "4.2.1",
|
||||
"image-webpack-loader": "6.0.0",
|
||||
"is-ci-cli": "2.0.0",
|
||||
"jest": "25.1.0",
|
||||
"lint-staged": "10.0.7",
|
||||
"markdown-toc": "^1.2.0",
|
||||
"mini-css-extract-plugin": "^2.9.2",
|
||||
"mkdirp": "3.0.1",
|
||||
"nopt": "^8.0.0",
|
||||
"postcss": "^8.4.49",
|
||||
"postcss-cli": "11.0.0",
|
||||
"postcss-import": "^16.1.0",
|
||||
"postcss-loader": "^8.1.1",
|
||||
"postcss-preset-env": "^10.1.2",
|
||||
"prettier": "^3.4.2",
|
||||
"ts-jest": "^29.2.5",
|
||||
"ts-loader": "9.5.1",
|
||||
"ts-node": "10.9.2",
|
||||
"typescript": "^5.7.2",
|
||||
"typescript-eslint": "^8.18.2",
|
||||
"url-loader": "4.1.1",
|
||||
"webpack": "^5.97.1",
|
||||
"webpack-cli": "^6.0.1",
|
||||
"webpack-dev-server": "^5.2.0",
|
||||
"whatwg-fetch": "3.6.20"
|
||||
"mini-css-extract-plugin": "0.9.0",
|
||||
"mkdirp": "1.0.3",
|
||||
"nopt": "4.0.1",
|
||||
"postcss": "7.0.26",
|
||||
"postcss-cli": "7.1.0",
|
||||
"postcss-import": "12.0.1",
|
||||
"postcss-loader": "3.0.0",
|
||||
"postcss-preset-env": "6.7.0",
|
||||
"prettier": "1.19.1",
|
||||
"ts-jest": "25.2.0",
|
||||
"ts-loader": "6.2.1",
|
||||
"ts-node": "8.6.2",
|
||||
"typescript": "3.7.5",
|
||||
"url-loader": "3.0.0",
|
||||
"webpack": "4.41.5",
|
||||
"webpack-cli": "3.3.10",
|
||||
"webpack-dev-server": "3.10.3",
|
||||
"whatwg-fetch": "3.0.0"
|
||||
},
|
||||
"resolutions": {
|
||||
"lodash": ">=4.17.20",
|
||||
"minimist": ">=1.2.5",
|
||||
"acorn": ">=7.4.0",
|
||||
"autolinker": ">=3.14.1",
|
||||
"bl": ">=2.2.1",
|
||||
"decompress": ">=4.2.1",
|
||||
"node-forge": ">=0.10.0",
|
||||
"trim-newlines": ">=3.0.1",
|
||||
"async": ">=2.6.4",
|
||||
"terser": ">=5.14.2",
|
||||
"semver-regex": ">=4.0.5",
|
||||
"http-cache-semantics": ">=4.1.1"
|
||||
"lodash": "4.17.15"
|
||||
},
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
|
|
|
|||
|
|
@ -67,7 +67,6 @@ function extractFiles(files: string[]): string[] {
|
|||
`;
|
||||
|
||||
if (options.version) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||
console.log(require('../package.json').version);
|
||||
process.exit(0);
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
176
src/__tests__/file-list-printer-tests.ts
Normal file
176
src/__tests__/file-list-printer-tests.ts
Normal file
|
|
@ -0,0 +1,176 @@
|
|||
import { render } from '../file-list-renderer';
|
||||
import HoganJsUtils from '../hoganjs-utils';
|
||||
|
||||
describe('FileListPrinter', () => {
|
||||
describe('generateFileList', () => {
|
||||
it('should expose old and new files to templates', () => {
|
||||
const hoganUtils = new HoganJsUtils({
|
||||
rawTemplates: {
|
||||
'file-summary-wrapper': '{{{files}}}',
|
||||
'file-summary-line': '{{oldName}}, {{newName}}, {{fileName}}',
|
||||
},
|
||||
});
|
||||
const files = [
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name.js',
|
||||
newName: 'my/file/name.js',
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name1.js',
|
||||
newName: 'my/file/name2.js',
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 0,
|
||||
language: 'js',
|
||||
oldName: 'dev/null',
|
||||
newName: 'my/file/name.js',
|
||||
isNew: true,
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 0,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name.js',
|
||||
newName: 'dev/null',
|
||||
isDeleted: true,
|
||||
},
|
||||
];
|
||||
|
||||
const fileHtml = render(files, hoganUtils);
|
||||
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"my/file/name.js, my/file/name.js, my/file/name.js
|
||||
my/file/name1.js, my/file/name2.js, my/file/{name1.js → name2.js}
|
||||
dev/null, my/file/name.js, my/file/name.js
|
||||
my/file/name.js, dev/null, my/file/name.js"
|
||||
`);
|
||||
});
|
||||
|
||||
it('should work for all kinds of files', () => {
|
||||
const hoganUtils = new HoganJsUtils({});
|
||||
const files = [
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name.js',
|
||||
newName: 'my/file/name.js',
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name1.js',
|
||||
newName: 'my/file/name2.js',
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 0,
|
||||
language: 'js',
|
||||
oldName: 'dev/null',
|
||||
newName: 'my/file/name.js',
|
||||
isNew: true,
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 0,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name.js',
|
||||
newName: 'dev/null',
|
||||
isDeleted: true,
|
||||
},
|
||||
];
|
||||
const fileHtml = render(files, hoganUtils);
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<div class=\\"d2h-file-list-wrapper\\">
|
||||
<div class=\\"d2h-file-list-header\\">
|
||||
<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-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>
|
||||
<li class=\\"d2h-file-list-line\\">
|
||||
<span class=\\"d2h-file-name-wrapper\\">
|
||||
<svg aria-hidden=\\"true\\" class=\\"d2h-icon d2h-moved\\" height=\\"16\\" title=\\"renamed\\" version=\\"1.1\\"
|
||||
viewBox=\\"0 0 14 16\\" width=\\"14\\">
|
||||
<path d=\\"M6 9H3V7h3V4l5 4-5 4V9z m8-7v12c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h12c0.55 0 1 0.45 1 1z m-1 0H1v12h12V2z\\"></path>
|
||||
</svg> <a href=\\"#d2h-662683\\" class=\\"d2h-file-name\\">my/file/{name1.js → name2.js}</a>
|
||||
<span class=\\"d2h-file-stats\\">
|
||||
<span class=\\"d2h-lines-added\\">+12</span>
|
||||
<span class=\\"d2h-lines-deleted\\">-41</span>
|
||||
</span>
|
||||
</span>
|
||||
</li>
|
||||
<li class=\\"d2h-file-list-line\\">
|
||||
<span class=\\"d2h-file-name-wrapper\\">
|
||||
<svg aria-hidden=\\"true\\" class=\\"d2h-icon d2h-added\\" height=\\"16\\" title=\\"added\\" 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 13H1V2h12v12zM6 9H3V7h3V4h2v3h3v2H8v3H6V9z\\"></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\\">-0</span>
|
||||
</span>
|
||||
</span>
|
||||
</li>
|
||||
<li class=\\"d2h-file-list-line\\">
|
||||
<span class=\\"d2h-file-name-wrapper\\">
|
||||
<svg aria-hidden=\\"true\\" class=\\"d2h-icon d2h-deleted\\" height=\\"16\\" title=\\"removed\\" 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 13H1V2h12v12zM11 9H3V7h8v2z\\"></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\\">+0</span>
|
||||
<span class=\\"d2h-lines-deleted\\">-41</span>
|
||||
</span>
|
||||
</span>
|
||||
</li>
|
||||
</ol>
|
||||
</div>"
|
||||
`);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
@ -1,272 +0,0 @@
|
|||
import { FileListRenderer } from '../file-list-renderer';
|
||||
import HoganJsUtils from '../hoganjs-utils';
|
||||
import { ColorSchemeType } from '../types';
|
||||
|
||||
describe('FileListRenderer', () => {
|
||||
describe('render', () => {
|
||||
it('should expose old and new files to templates', () => {
|
||||
const hoganUtils = new HoganJsUtils({
|
||||
rawTemplates: {
|
||||
'file-summary-wrapper': '{{{files}}}',
|
||||
'file-summary-line': '{{oldName}}, {{newName}}, {{fileName}}',
|
||||
},
|
||||
});
|
||||
const fileListRenderer = new FileListRenderer(hoganUtils);
|
||||
const files = [
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name.js',
|
||||
newName: 'my/file/name.js',
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name1.js',
|
||||
newName: 'my/file/name2.js',
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 0,
|
||||
language: 'js',
|
||||
oldName: 'dev/null',
|
||||
newName: 'my/file/name.js',
|
||||
isNew: true,
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 0,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name.js',
|
||||
newName: 'dev/null',
|
||||
isDeleted: true,
|
||||
},
|
||||
];
|
||||
|
||||
const fileHtml = fileListRenderer.render(files);
|
||||
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"my/file/name.js, my/file/name.js, my/file/name.js
|
||||
my/file/name1.js, my/file/name2.js, my/file/{name1.js → name2.js}
|
||||
dev/null, my/file/name.js, my/file/name.js
|
||||
my/file/name.js, dev/null, my/file/name.js"
|
||||
`);
|
||||
});
|
||||
|
||||
it('should work for all kinds of files', () => {
|
||||
const hoganUtils = new HoganJsUtils({});
|
||||
const fileListRenderer = new FileListRenderer(hoganUtils);
|
||||
|
||||
const files = [
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name.js',
|
||||
newName: 'my/file/name.js',
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name1.js',
|
||||
newName: 'my/file/name2.js',
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 12,
|
||||
deletedLines: 0,
|
||||
language: 'js',
|
||||
oldName: 'dev/null',
|
||||
newName: 'my/file/name.js',
|
||||
isNew: true,
|
||||
},
|
||||
{
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
blocks: [],
|
||||
addedLines: 0,
|
||||
deletedLines: 41,
|
||||
language: 'js',
|
||||
oldName: 'my/file/name.js',
|
||||
newName: 'dev/null',
|
||||
isDeleted: true,
|
||||
},
|
||||
];
|
||||
const fileHtml = fileListRenderer.render(files);
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<div class="d2h-file-list-wrapper d2h-light-color-scheme">
|
||||
<div class="d2h-file-list-header">
|
||||
<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-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>
|
||||
<li class="d2h-file-list-line">
|
||||
<span class="d2h-file-name-wrapper">
|
||||
<svg aria-hidden="true" class="d2h-icon d2h-moved" height="16" title="renamed" version="1.1"
|
||||
viewBox="0 0 14 16" width="14">
|
||||
<path d="M6 9H3V7h3V4l5 4-5 4V9z m8-7v12c0 0.55-0.45 1-1 1H1c-0.55 0-1-0.45-1-1V2c0-0.55 0.45-1 1-1h12c0.55 0 1 0.45 1 1z m-1 0H1v12h12V2z"></path>
|
||||
</svg> <a href="#d2h-662683" class="d2h-file-name">my/file/{name1.js → name2.js}</a>
|
||||
<span class="d2h-file-stats">
|
||||
<span class="d2h-lines-added">+12</span>
|
||||
<span class="d2h-lines-deleted">-41</span>
|
||||
</span>
|
||||
</span>
|
||||
</li>
|
||||
<li class="d2h-file-list-line">
|
||||
<span class="d2h-file-name-wrapper">
|
||||
<svg aria-hidden="true" class="d2h-icon d2h-added" height="16" title="added" 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 13H1V2h12v12zM6 9H3V7h3V4h2v3h3v2H8v3H6V9z"></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">-0</span>
|
||||
</span>
|
||||
</span>
|
||||
</li>
|
||||
<li class="d2h-file-list-line">
|
||||
<span class="d2h-file-name-wrapper">
|
||||
<svg aria-hidden="true" class="d2h-icon d2h-deleted" height="16" title="removed" 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 13H1V2h12v12zM11 9H3V7h8v2z"></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">+0</span>
|
||||
<span class="d2h-lines-deleted">-41</span>
|
||||
</span>
|
||||
</span>
|
||||
</li>
|
||||
</ol>
|
||||
</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>"
|
||||
`);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
@ -11,8 +11,8 @@ describe('HoganJsUtils', () => {
|
|||
});
|
||||
expect(result).toMatchInlineSnapshot(`
|
||||
"<tr>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-line">
|
||||
<td class=\\"d2h-info\\">
|
||||
<div class=\\"d2h-code-line d2h-info\\">
|
||||
File without changes
|
||||
</div>
|
||||
</td>
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ describe('LineByLineRenderer', () => {
|
|||
const fileHtml = lineByLineRenderer.generateEmptyDiff();
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<tr>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-line">
|
||||
<td class=\\"d2h-info\\">
|
||||
<div class=\\"d2h-code-line d2h-info\\">
|
||||
File without changes
|
||||
</div>
|
||||
</td>
|
||||
|
|
@ -23,19 +23,9 @@ describe('LineByLineRenderer', () => {
|
|||
|
||||
describe('makeLineHtml', () => {
|
||||
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 lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
||||
type: CSSLineClass.INSERTS,
|
||||
prefix: '+',
|
||||
content: 'test',
|
||||
|
|
@ -44,14 +34,14 @@ describe('LineByLineRenderer', () => {
|
|||
});
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<tr>
|
||||
<td class="d2h-code-linenumber d2h-ins">
|
||||
<div class="line-num1"></div>
|
||||
<div class="line-num2">30</div>
|
||||
<td class=\\"d2h-code-linenumber d2h-ins\\">
|
||||
<div class=\\"line-num1\\"></div>
|
||||
<div class=\\"line-num2\\">30</div>
|
||||
</td>
|
||||
<td class="d2h-ins">
|
||||
<div class="d2h-code-line">
|
||||
<span class="d2h-code-line-prefix">+</span>
|
||||
<span class="d2h-code-line-ctn">test</span>
|
||||
<td class=\\"d2h-ins\\">
|
||||
<div class=\\"d2h-code-line d2h-ins\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\">test</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>"
|
||||
|
|
@ -59,19 +49,9 @@ describe('LineByLineRenderer', () => {
|
|||
});
|
||||
|
||||
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 lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
||||
type: CSSLineClass.DELETES,
|
||||
prefix: '-',
|
||||
content: 'test',
|
||||
|
|
@ -80,14 +60,14 @@ describe('LineByLineRenderer', () => {
|
|||
});
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<tr>
|
||||
<td class="d2h-code-linenumber d2h-del">
|
||||
<div class="line-num1">30</div>
|
||||
<div class="line-num2"></div>
|
||||
<td class=\\"d2h-code-linenumber d2h-del\\">
|
||||
<div class=\\"line-num1\\">30</div>
|
||||
<div class=\\"line-num2\\"></div>
|
||||
</td>
|
||||
<td class="d2h-del">
|
||||
<div class="d2h-code-line">
|
||||
<span class="d2h-code-line-prefix">-</span>
|
||||
<span class="d2h-code-line-ctn">test</span>
|
||||
<td class=\\"d2h-del\\">
|
||||
<div class=\\"d2h-code-line d2h-del\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
||||
<span class=\\"d2h-code-line-ctn\\">test</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>"
|
||||
|
|
@ -95,19 +75,9 @@ describe('LineByLineRenderer', () => {
|
|||
});
|
||||
|
||||
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 lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
||||
type: CSSLineClass.INSERTS,
|
||||
prefix: '+',
|
||||
content: ' test',
|
||||
|
|
@ -116,14 +86,14 @@ describe('LineByLineRenderer', () => {
|
|||
});
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<tr>
|
||||
<td class="d2h-code-linenumber d2h-ins">
|
||||
<div class="line-num1"></div>
|
||||
<div class="line-num2">30</div>
|
||||
<td class=\\"d2h-code-linenumber d2h-ins\\">
|
||||
<div class=\\"line-num1\\"></div>
|
||||
<div class=\\"line-num2\\">30</div>
|
||||
</td>
|
||||
<td class="d2h-ins">
|
||||
<div class="d2h-code-line">
|
||||
<span class="d2h-code-line-prefix">+</span>
|
||||
<span class="d2h-code-line-ctn"> test</span>
|
||||
<td class=\\"d2h-ins\\">
|
||||
<div class=\\"d2h-code-line d2h-ins\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\"> test</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>"
|
||||
|
|
@ -131,19 +101,9 @@ describe('LineByLineRenderer', () => {
|
|||
});
|
||||
|
||||
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 lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
||||
type: CSSLineClass.INSERTS,
|
||||
prefix: '+',
|
||||
content: ' test',
|
||||
|
|
@ -152,14 +112,14 @@ describe('LineByLineRenderer', () => {
|
|||
});
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<tr>
|
||||
<td class="d2h-code-linenumber d2h-ins">
|
||||
<div class="line-num1"></div>
|
||||
<div class="line-num2">30</div>
|
||||
<td class=\\"d2h-code-linenumber d2h-ins\\">
|
||||
<div class=\\"line-num1\\"></div>
|
||||
<div class=\\"line-num2\\">30</div>
|
||||
</td>
|
||||
<td class="d2h-ins">
|
||||
<div class="d2h-code-line">
|
||||
<span class="d2h-code-line-prefix">+</span>
|
||||
<span class="d2h-code-line-ctn"> test</span>
|
||||
<td class=\\"d2h-ins\\">
|
||||
<div class=\\"d2h-code-line d2h-ins\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\"> test</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>"
|
||||
|
|
@ -167,19 +127,9 @@ describe('LineByLineRenderer', () => {
|
|||
});
|
||||
|
||||
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 lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
||||
type: CSSLineClass.INSERTS,
|
||||
prefix: '+',
|
||||
content: '\ttest',
|
||||
|
|
@ -188,14 +138,14 @@ describe('LineByLineRenderer', () => {
|
|||
});
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<tr>
|
||||
<td class="d2h-code-linenumber d2h-ins">
|
||||
<div class="line-num1"></div>
|
||||
<div class="line-num2">30</div>
|
||||
<td class=\\"d2h-code-linenumber d2h-ins\\">
|
||||
<div class=\\"line-num1\\"></div>
|
||||
<div class=\\"line-num2\\">30</div>
|
||||
</td>
|
||||
<td class="d2h-ins">
|
||||
<div class="d2h-code-line">
|
||||
<span class="d2h-code-line-prefix">+</span>
|
||||
<span class="d2h-code-line-ctn"> test</span>
|
||||
<td class=\\"d2h-ins\\">
|
||||
<div class=\\"d2h-code-line d2h-ins\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\"> test</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>"
|
||||
|
|
@ -223,22 +173,18 @@ describe('LineByLineRenderer', () => {
|
|||
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
||||
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<div id="d2h-781444" class="d2h-file-wrapper" data-lang="js">
|
||||
<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">my/file/name.js</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 id=\\"d2h-781444\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
||||
<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\\">my/file/name.js</span>
|
||||
<span class=\\"d2h-tag d2h-changed d2h-changed-tag\\">CHANGED</span></span>
|
||||
</div>
|
||||
<div class="d2h-file-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<div class=\\"d2h-file-diff\\">
|
||||
<div class=\\"d2h-code-wrapper\\">
|
||||
<table class=\\"d2h-diff-table\\">
|
||||
<tbody class=\\"d2h-diff-tbody\\">
|
||||
<span>Random Html</span>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
@ -267,22 +213,18 @@ describe('LineByLineRenderer', () => {
|
|||
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
||||
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<div id="d2h-781444" class="d2h-file-wrapper" data-lang="js">
|
||||
<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">my/file/name.js</span>
|
||||
<span class="d2h-tag d2h-added d2h-added-tag">ADDED</span></span>
|
||||
<label class="d2h-file-collapse">
|
||||
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||||
Viewed
|
||||
</label>
|
||||
"<div id=\\"d2h-781444\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
||||
<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\\">my/file/name.js</span>
|
||||
<span class=\\"d2h-tag d2h-added d2h-added-tag\\">ADDED</span></span>
|
||||
</div>
|
||||
<div class="d2h-file-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<div class=\\"d2h-file-diff\\">
|
||||
<div class=\\"d2h-code-wrapper\\">
|
||||
<table class=\\"d2h-diff-table\\">
|
||||
<tbody class=\\"d2h-diff-tbody\\">
|
||||
<span>Random Html</span>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
@ -311,22 +253,18 @@ describe('LineByLineRenderer', () => {
|
|||
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
||||
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<div id="d2h-781444" class="d2h-file-wrapper" data-lang="js">
|
||||
<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">my/file/name.js</span>
|
||||
<span class="d2h-tag d2h-deleted d2h-deleted-tag">DELETED</span></span>
|
||||
<label class="d2h-file-collapse">
|
||||
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||||
Viewed
|
||||
</label>
|
||||
"<div id=\\"d2h-781444\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
||||
<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\\">my/file/name.js</span>
|
||||
<span class=\\"d2h-tag d2h-deleted d2h-deleted-tag\\">DELETED</span></span>
|
||||
</div>
|
||||
<div class="d2h-file-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<div class=\\"d2h-file-diff\\">
|
||||
<div class=\\"d2h-code-wrapper\\">
|
||||
<table class=\\"d2h-diff-table\\">
|
||||
<tbody class=\\"d2h-diff-tbody\\">
|
||||
<span>Random Html</span>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
@ -355,22 +293,18 @@ describe('LineByLineRenderer', () => {
|
|||
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
||||
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
"<div id="d2h-662683" class="d2h-file-wrapper" data-lang="js">
|
||||
<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">my/file/{name1.js → name2.js}</span>
|
||||
<span class="d2h-tag d2h-moved d2h-moved-tag">RENAMED</span></span>
|
||||
<label class="d2h-file-collapse">
|
||||
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||||
Viewed
|
||||
</label>
|
||||
"<div id=\\"d2h-662683\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
||||
<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\\">my/file/{name1.js → name2.js}</span>
|
||||
<span class=\\"d2h-tag d2h-moved d2h-moved-tag\\">RENAMED</span></span>
|
||||
</div>
|
||||
<div class="d2h-file-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<div class=\\"d2h-file-diff\\">
|
||||
<div class=\\"d2h-code-wrapper\\">
|
||||
<table class=\\"d2h-diff-table\\">
|
||||
<tbody class=\\"d2h-diff-tbody\\">
|
||||
<span>Random Html</span>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
@ -449,48 +383,44 @@ describe('LineByLineRenderer', () => {
|
|||
});
|
||||
const html = lineByLineRenderer.render(exampleJson);
|
||||
expect(html).toMatchInlineSnapshot(`
|
||||
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="txt">
|
||||
<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 class=\\"d2h-wrapper\\">
|
||||
<div id=\\"d2h-675094\\" class=\\"d2h-file-wrapper\\" data-lang=\\"txt\\">
|
||||
<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>
|
||||
</div>
|
||||
<div class="d2h-file-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<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 class=\\"d2h-code-linenumber d2h-info\\"></td>
|
||||
<td class=\\"d2h-info\\">
|
||||
<div class=\\"d2h-code-line d2h-info\\">@@ -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 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>
|
||||
<td class=\\"d2h-del d2h-change\\">
|
||||
<div class=\\"d2h-code-line d2h-del d2h-change\\">
|
||||
<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 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>test1r</ins></span>
|
||||
<td class=\\"d2h-ins d2h-change\\">
|
||||
<div class=\\"d2h-code-line d2h-ins d2h-change\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\"><ins>test1r</ins></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
@ -523,26 +453,22 @@ describe('LineByLineRenderer', () => {
|
|||
});
|
||||
const html = lineByLineRenderer.render(exampleJson);
|
||||
expect(html).toMatchInlineSnapshot(`
|
||||
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
||||
<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 class=\\"d2h-wrapper\\">
|
||||
<div id=\\"d2h-675094\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
||||
<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>
|
||||
</div>
|
||||
<div class="d2h-file-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<div class=\\"d2h-file-diff\\">
|
||||
<div class=\\"d2h-code-wrapper\\">
|
||||
<table class=\\"d2h-diff-table\\">
|
||||
<tbody class=\\"d2h-diff-tbody\\">
|
||||
<tr>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-line">
|
||||
<td class=\\"d2h-info\\">
|
||||
<div class=\\"d2h-code-line d2h-info\\">
|
||||
File without changes
|
||||
</div>
|
||||
</td>
|
||||
|
|
@ -555,65 +481,6 @@ describe('LineByLineRenderer', () => {
|
|||
</div>"
|
||||
`);
|
||||
});
|
||||
|
||||
it('should work for too big file diff', () => {
|
||||
const exampleJson = [
|
||||
{
|
||||
blocks: [
|
||||
{
|
||||
header: '<a href="http://example.com">Custom link to render</a>',
|
||||
lines: [],
|
||||
newStartLine: 0,
|
||||
oldStartLine: 0,
|
||||
oldStartLine2: undefined,
|
||||
},
|
||||
],
|
||||
deletedLines: 0,
|
||||
addedLines: 0,
|
||||
oldName: 'sample',
|
||||
language: 'js',
|
||||
newName: 'sample',
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
isTooBig: true,
|
||||
},
|
||||
];
|
||||
|
||||
const hoganUtils = new HoganJsUtils({});
|
||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils);
|
||||
const html = lineByLineRenderer.render(exampleJson);
|
||||
expect(html).toMatchInlineSnapshot(`
|
||||
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
||||
<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"><a href="http://example.com">Custom link to render</a></div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>"
|
||||
`);
|
||||
});
|
||||
});
|
||||
|
||||
describe('_generateFileHtml', () => {
|
||||
|
|
@ -670,52 +537,52 @@ describe('LineByLineRenderer', () => {
|
|||
|
||||
expect(html).toMatchInlineSnapshot(`
|
||||
"<tr>
|
||||
<td class="d2h-code-linenumber d2h-info"></td>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-line">@@ -1 +1 @@</div>
|
||||
<td class=\\"d2h-code-linenumber d2h-info\\"></td>
|
||||
<td class=\\"d2h-info\\">
|
||||
<div class=\\"d2h-code-line d2h-info\\">@@ -1 +1 @@</div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="d2h-code-linenumber d2h-cntx">
|
||||
<div class="line-num1">1</div>
|
||||
<div class="line-num2">1</div>
|
||||
<td class=\\"d2h-code-linenumber d2h-cntx\\">
|
||||
<div class=\\"line-num1\\">1</div>
|
||||
<div class=\\"line-num2\\">1</div>
|
||||
</td>
|
||||
<td class="d2h-cntx">
|
||||
<div class="d2h-code-line">
|
||||
<span class="d2h-code-line-prefix"> </span>
|
||||
<span class="d2h-code-line-ctn">one context line</span>
|
||||
<td class=\\"d2h-cntx\\">
|
||||
<div class=\\"d2h-code-line d2h-cntx\\">
|
||||
<span class=\\"d2h-code-line-prefix\\"> </span>
|
||||
<span class=\\"d2h-code-line-ctn\\">one context line</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||||
<div class="line-num1">2</div>
|
||||
<div class="line-num2"></div>
|
||||
<td class=\\"d2h-code-linenumber d2h-del d2h-change\\">
|
||||
<div class=\\"line-num1\\">2</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>
|
||||
<td class=\\"d2h-del d2h-change\\">
|
||||
<div class=\\"d2h-code-line d2h-del d2h-change\\">
|
||||
<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">2</div>
|
||||
<td class=\\"d2h-code-linenumber d2h-ins d2h-change\\">
|
||||
<div class=\\"line-num1\\"></div>
|
||||
<div class=\\"line-num2\\">2</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>test1r</ins></span>
|
||||
<td class=\\"d2h-ins d2h-change\\">
|
||||
<div class=\\"d2h-code-line d2h-ins d2h-change\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\"><ins>test1r</ins></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="d2h-code-linenumber d2h-ins">
|
||||
<div class="line-num1"></div>
|
||||
<div class="line-num2">3</div>
|
||||
<td class=\\"d2h-code-linenumber d2h-ins\\">
|
||||
<div class=\\"line-num1\\"></div>
|
||||
<div class=\\"line-num2\\">3</div>
|
||||
</td>
|
||||
<td class="d2h-ins">
|
||||
<div class="d2h-code-line">
|
||||
<span class="d2h-code-line-prefix">+</span>
|
||||
<span class="d2h-code-line-ctn">test2r</span>
|
||||
<td class=\\"d2h-ins\\">
|
||||
<div class=\\"d2h-code-line d2h-ins\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\">test2r</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>"
|
||||
|
|
|
|||
|
|
@ -5,31 +5,31 @@ describe('Utils', () => {
|
|||
describe('escapeForHtml', () => {
|
||||
it('should escape & with &', () => {
|
||||
const result = escapeForHtml('&');
|
||||
expect(result).toBe('&');
|
||||
expect(result).toEqual('&');
|
||||
});
|
||||
it('should escape < with <', () => {
|
||||
const result = escapeForHtml('<');
|
||||
expect(result).toBe('<');
|
||||
expect(result).toEqual('<');
|
||||
});
|
||||
it('should escape > with >', () => {
|
||||
const result = escapeForHtml('>');
|
||||
expect(result).toBe('>');
|
||||
expect(result).toEqual('>');
|
||||
});
|
||||
it('should escape " with "', () => {
|
||||
const result = escapeForHtml('"');
|
||||
expect(result).toBe('"');
|
||||
expect(result).toEqual('"');
|
||||
});
|
||||
it("should escape ' with '", () => {
|
||||
const result = escapeForHtml("'");
|
||||
expect(result).toBe(''');
|
||||
expect(result).toEqual(''');
|
||||
});
|
||||
it('should escape / with /', () => {
|
||||
const result = escapeForHtml('/');
|
||||
expect(result).toBe('/');
|
||||
expect(result).toEqual('/');
|
||||
});
|
||||
it('should escape a string containing HTML code', () => {
|
||||
const result = escapeForHtml(`<a href="/search?q=diff2html">Search 'Diff2Html'</a>`);
|
||||
expect(result).toBe(
|
||||
expect(result).toEqual(
|
||||
'<a href="/search?q=diff2html">Search 'Diff2Html'</a>',
|
||||
);
|
||||
});
|
||||
|
|
@ -41,7 +41,7 @@ describe('Utils', () => {
|
|||
oldName: 'sample.js',
|
||||
newName: 'sample.js',
|
||||
});
|
||||
expect(result).toBe('d2h-960013');
|
||||
expect(result).toEqual('d2h-960013');
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -51,49 +51,49 @@ describe('Utils', () => {
|
|||
oldName: 'sample.js',
|
||||
newName: 'sample.js',
|
||||
});
|
||||
expect(result).toBe('sample.js');
|
||||
expect(result).toEqual('sample.js');
|
||||
});
|
||||
it('should generate the file name for a changed file and full rename', () => {
|
||||
const result = filenameDiff({
|
||||
oldName: 'sample1.js',
|
||||
newName: 'sample2.js',
|
||||
});
|
||||
expect(result).toBe('sample1.js → sample2.js');
|
||||
expect(result).toEqual('sample1.js → sample2.js');
|
||||
});
|
||||
it('should generate the file name for a changed file and prefix rename', () => {
|
||||
const result = filenameDiff({
|
||||
oldName: 'src/path/sample.js',
|
||||
newName: 'source/path/sample.js',
|
||||
});
|
||||
expect(result).toBe('{src → source}/path/sample.js');
|
||||
expect(result).toEqual('{src → source}/path/sample.js');
|
||||
});
|
||||
it('should generate the file name for a changed file and suffix rename', () => {
|
||||
const result = filenameDiff({
|
||||
oldName: 'src/path/sample1.js',
|
||||
newName: 'src/path/sample2.js',
|
||||
});
|
||||
expect(result).toBe('src/path/{sample1.js → sample2.js}');
|
||||
expect(result).toEqual('src/path/{sample1.js → sample2.js}');
|
||||
});
|
||||
it('should generate the file name for a changed file and middle rename', () => {
|
||||
const result = filenameDiff({
|
||||
oldName: 'src/really/big/path/sample.js',
|
||||
newName: 'src/small/path/sample.js',
|
||||
});
|
||||
expect(result).toBe('src/{really/big → small}/path/sample.js');
|
||||
expect(result).toEqual('src/{really/big → small}/path/sample.js');
|
||||
});
|
||||
it('should generate the file name for a deleted file', () => {
|
||||
const result = filenameDiff({
|
||||
oldName: 'src/my/file.js',
|
||||
newName: '/dev/null',
|
||||
});
|
||||
expect(result).toBe('src/my/file.js');
|
||||
expect(result).toEqual('src/my/file.js');
|
||||
});
|
||||
it('should generate the file name for a new file', () => {
|
||||
const result = filenameDiff({
|
||||
oldName: '/dev/null',
|
||||
newName: 'src/my/file.js',
|
||||
});
|
||||
expect(result).toBe('src/my/file.js');
|
||||
expect(result).toEqual('src/my/file.js');
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -10,10 +10,10 @@ describe('SideBySideRenderer', () => {
|
|||
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {});
|
||||
const fileHtml = sideBySideRenderer.generateEmptyDiff();
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
{
|
||||
Object {
|
||||
"left": "<tr>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-side-line">
|
||||
<td class=\\"d2h-info\\">
|
||||
<div class=\\"d2h-code-side-line d2h-info\\">
|
||||
File without changes
|
||||
</div>
|
||||
</td>
|
||||
|
|
@ -78,76 +78,76 @@ describe('SideBySideRenderer', () => {
|
|||
const fileHtml = sideBySideRenderer.generateFileHtml(file);
|
||||
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
{
|
||||
Object {
|
||||
"left": "<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-info"></td>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-side-line">@@ -19,7 +19,7 @@</div>
|
||||
<td class=\\"d2h-code-side-linenumber d2h-info\\"></td>
|
||||
<td class=\\"d2h-info\\">
|
||||
<div class=\\"d2h-code-side-line d2h-info\\">@@ -19,7 +19,7 @@</div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="d2h-code-side-linenumber d2h-cntx">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-cntx\\">
|
||||
19
|
||||
</td>
|
||||
<td class="d2h-cntx">
|
||||
<div class="d2h-code-side-line">
|
||||
<span class="d2h-code-line-prefix"> </span>
|
||||
<span class="d2h-code-line-ctn">context</span>
|
||||
<td class=\\"d2h-cntx\\">
|
||||
<div class=\\"d2h-code-side-line d2h-cntx\\">
|
||||
<span class=\\"d2h-code-line-prefix\\"> </span>
|
||||
<span class=\\"d2h-code-line-ctn\\">context</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="d2h-code-side-linenumber d2h-del d2h-change">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-del d2h-change\\">
|
||||
20
|
||||
</td>
|
||||
<td class="d2h-del d2h-change">
|
||||
<div class="d2h-code-side-line">
|
||||
<span class="d2h-code-line-prefix">-</span>
|
||||
<span class="d2h-code-line-ctn"><del>removed</del></span>
|
||||
<td class=\\"d2h-del d2h-change\\">
|
||||
<div class=\\"d2h-code-side-line d2h-del d2h-change\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
||||
<span class=\\"d2h-code-line-ctn\\"><del>removed</del></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder\\">
|
||||
|
||||
</td>
|
||||
<td class="d2h-cntx d2h-emptyplaceholder">
|
||||
<div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
|
||||
<span class="d2h-code-line-prefix"> </span>
|
||||
<span class="d2h-code-line-ctn"><br></span>
|
||||
<td class=\\"d2h-cntx d2h-emptyplaceholder\\">
|
||||
<div class=\\"d2h-code-side-line d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder\\">
|
||||
<span class=\\"d2h-code-line-prefix\\"> </span>
|
||||
<span class=\\"d2h-code-line-ctn\\"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>",
|
||||
"right": "<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-info"></td>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-side-line"> </div>
|
||||
<td class=\\"d2h-code-side-linenumber d2h-info\\"></td>
|
||||
<td class=\\"d2h-info\\">
|
||||
<div class=\\"d2h-code-side-line d2h-info\\"></div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="d2h-code-side-linenumber d2h-cntx">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-cntx\\">
|
||||
19
|
||||
</td>
|
||||
<td class="d2h-cntx">
|
||||
<div class="d2h-code-side-line">
|
||||
<span class="d2h-code-line-prefix"> </span>
|
||||
<span class="d2h-code-line-ctn">context</span>
|
||||
<td class=\\"d2h-cntx\\">
|
||||
<div class=\\"d2h-code-side-line d2h-cntx\\">
|
||||
<span class=\\"d2h-code-line-prefix\\"> </span>
|
||||
<span class=\\"d2h-code-line-ctn\\">context</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="d2h-code-side-linenumber d2h-ins d2h-change">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-ins d2h-change\\">
|
||||
20
|
||||
</td>
|
||||
<td class="d2h-ins d2h-change">
|
||||
<div class="d2h-code-side-line">
|
||||
<span class="d2h-code-line-prefix">+</span>
|
||||
<span class="d2h-code-line-ctn"><ins>added</ins></span>
|
||||
<td class=\\"d2h-ins d2h-change\\">
|
||||
<div class=\\"d2h-code-side-line d2h-ins d2h-change\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\"><ins>added</ins></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="d2h-code-side-linenumber d2h-ins">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-ins\\">
|
||||
21
|
||||
</td>
|
||||
<td class="d2h-ins">
|
||||
<div class="d2h-code-side-line">
|
||||
<span class="d2h-code-line-prefix">+</span>
|
||||
<span class="d2h-code-line-ctn">another added</span>
|
||||
<td class=\\"d2h-ins\\">
|
||||
<div class=\\"d2h-code-side-line d2h-ins\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\">another added</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>",
|
||||
|
|
@ -168,26 +168,26 @@ describe('SideBySideRenderer', () => {
|
|||
});
|
||||
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
{
|
||||
Object {
|
||||
"left": "<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder\\">
|
||||
|
||||
</td>
|
||||
<td class="d2h-cntx d2h-emptyplaceholder">
|
||||
<div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
|
||||
<span class="d2h-code-line-prefix"> </span>
|
||||
<span class="d2h-code-line-ctn"><br></span>
|
||||
<td class=\\"d2h-cntx d2h-emptyplaceholder\\">
|
||||
<div class=\\"d2h-code-side-line d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder\\">
|
||||
<span class=\\"d2h-code-line-prefix\\"> </span>
|
||||
<span class=\\"d2h-code-line-ctn\\"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>",
|
||||
"right": "<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-ins">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-ins\\">
|
||||
30
|
||||
</td>
|
||||
<td class="d2h-ins">
|
||||
<div class="d2h-code-side-line">
|
||||
<span class="d2h-code-line-prefix">+</span>
|
||||
<span class="d2h-code-line-ctn">test</span>
|
||||
<td class=\\"d2h-ins\\">
|
||||
<div class=\\"d2h-code-side-line d2h-ins\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\">test</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>",
|
||||
|
|
@ -208,26 +208,26 @@ describe('SideBySideRenderer', () => {
|
|||
);
|
||||
|
||||
expect(fileHtml).toMatchInlineSnapshot(`
|
||||
{
|
||||
Object {
|
||||
"left": "<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-del">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-del\\">
|
||||
30
|
||||
</td>
|
||||
<td class="d2h-del">
|
||||
<div class="d2h-code-side-line">
|
||||
<span class="d2h-code-line-prefix">-</span>
|
||||
<span class="d2h-code-line-ctn">test</span>
|
||||
<td class=\\"d2h-del\\">
|
||||
<div class=\\"d2h-code-side-line d2h-del\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
||||
<span class=\\"d2h-code-line-ctn\\">test</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>",
|
||||
"right": "<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder\\">
|
||||
|
||||
</td>
|
||||
<td class="d2h-cntx d2h-emptyplaceholder">
|
||||
<div class="d2h-code-side-line d2h-code-side-emptyplaceholder">
|
||||
<span class="d2h-code-line-prefix"> </span>
|
||||
<span class="d2h-code-line-ctn"><br></span>
|
||||
<td class=\\"d2h-cntx d2h-emptyplaceholder\\">
|
||||
<div class=\\"d2h-code-side-line d2h-code-side-emptyplaceholder d2h-cntx d2h-emptyplaceholder\\">
|
||||
<span class=\\"d2h-code-line-prefix\\"> </span>
|
||||
<span class=\\"d2h-code-line-ctn\\"> </span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>",
|
||||
|
|
@ -278,37 +278,33 @@ describe('SideBySideRenderer', () => {
|
|||
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, { matching: LineMatchingType.LINES });
|
||||
const html = sideBySideRenderer.render(exampleJson);
|
||||
expect(html).toMatchInlineSnapshot(`
|
||||
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="txt">
|
||||
<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 class=\\"d2h-wrapper\\">
|
||||
<div id=\\"d2h-675094\\" class=\\"d2h-file-wrapper\\" data-lang=\\"txt\\">
|
||||
<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>
|
||||
</div>
|
||||
<div class="d2h-files-diff">
|
||||
<div class="d2h-file-side-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<div class=\\"d2h-files-diff\\">
|
||||
<div class=\\"d2h-file-side-diff\\">
|
||||
<div class=\\"d2h-code-wrapper\\">
|
||||
<table class=\\"d2h-diff-table\\">
|
||||
<tbody class=\\"d2h-diff-tbody\\">
|
||||
<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-info"></td>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-side-line">@@ -1 +1 @@</div>
|
||||
<td class=\\"d2h-code-side-linenumber d2h-info\\"></td>
|
||||
<td class=\\"d2h-info\\">
|
||||
<div class=\\"d2h-code-side-line d2h-info\\">@@ -1 +1 @@</div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="d2h-code-side-linenumber d2h-del d2h-change">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-del d2h-change\\">
|
||||
1
|
||||
</td>
|
||||
<td class="d2h-del d2h-change">
|
||||
<div class="d2h-code-side-line">
|
||||
<span class="d2h-code-line-prefix">-</span>
|
||||
<span class="d2h-code-line-ctn"><del>test</del></span>
|
||||
<td class=\\"d2h-del d2h-change\\">
|
||||
<div class=\\"d2h-code-side-line d2h-del d2h-change\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
||||
<span class=\\"d2h-code-line-ctn\\"><del>test</del></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
@ -316,23 +312,23 @@ describe('SideBySideRenderer', () => {
|
|||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d2h-file-side-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<div class=\\"d2h-file-side-diff\\">
|
||||
<div class=\\"d2h-code-wrapper\\">
|
||||
<table class=\\"d2h-diff-table\\">
|
||||
<tbody class=\\"d2h-diff-tbody\\">
|
||||
<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-info"></td>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-side-line"> </div>
|
||||
<td class=\\"d2h-code-side-linenumber d2h-info\\"></td>
|
||||
<td class=\\"d2h-info\\">
|
||||
<div class=\\"d2h-code-side-line d2h-info\\"></div>
|
||||
</td>
|
||||
</tr><tr>
|
||||
<td class="d2h-code-side-linenumber d2h-ins d2h-change">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-ins d2h-change\\">
|
||||
1
|
||||
</td>
|
||||
<td class="d2h-ins d2h-change">
|
||||
<div class="d2h-code-side-line">
|
||||
<span class="d2h-code-line-prefix">+</span>
|
||||
<span class="d2h-code-line-ctn"><ins>test1r</ins></span>
|
||||
<td class=\\"d2h-ins d2h-change\\">
|
||||
<div class=\\"d2h-code-side-line d2h-ins d2h-change\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\"><ins>test1r</ins></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
@ -363,27 +359,23 @@ describe('SideBySideRenderer', () => {
|
|||
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {});
|
||||
const html = sideBySideRenderer.render(exampleJson);
|
||||
expect(html).toMatchInlineSnapshot(`
|
||||
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
||||
<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 class=\\"d2h-wrapper\\">
|
||||
<div id=\\"d2h-675094\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
||||
<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>
|
||||
</div>
|
||||
<div class="d2h-files-diff">
|
||||
<div class="d2h-file-side-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<div class=\\"d2h-files-diff\\">
|
||||
<div class=\\"d2h-file-side-diff\\">
|
||||
<div class=\\"d2h-code-wrapper\\">
|
||||
<table class=\\"d2h-diff-table\\">
|
||||
<tbody class=\\"d2h-diff-tbody\\">
|
||||
<tr>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-side-line">
|
||||
<td class=\\"d2h-info\\">
|
||||
<div class=\\"d2h-code-side-line d2h-info\\">
|
||||
File without changes
|
||||
</div>
|
||||
</td>
|
||||
|
|
@ -392,10 +384,10 @@ describe('SideBySideRenderer', () => {
|
|||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d2h-file-side-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<div class=\\"d2h-file-side-diff\\">
|
||||
<div class=\\"d2h-code-wrapper\\">
|
||||
<table class=\\"d2h-diff-table\\">
|
||||
<tbody class=\\"d2h-diff-tbody\\">
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
@ -406,81 +398,6 @@ describe('SideBySideRenderer', () => {
|
|||
</div>"
|
||||
`);
|
||||
});
|
||||
|
||||
it('should work for too big file diff', () => {
|
||||
const exampleJson = [
|
||||
{
|
||||
blocks: [
|
||||
{
|
||||
header: '<a href="http://example.com">Custom link to render</a>',
|
||||
lines: [],
|
||||
newStartLine: 0,
|
||||
oldStartLine: 0,
|
||||
oldStartLine2: undefined,
|
||||
},
|
||||
],
|
||||
deletedLines: 0,
|
||||
addedLines: 0,
|
||||
oldName: 'sample',
|
||||
language: 'js',
|
||||
newName: 'sample',
|
||||
isCombined: false,
|
||||
isGitDiff: false,
|
||||
isTooBig: true,
|
||||
},
|
||||
];
|
||||
|
||||
const hoganUtils = new HoganJsUtils({});
|
||||
const sideBySideRenderer = new SideBySideRenderer(hoganUtils);
|
||||
const html = sideBySideRenderer.render(exampleJson);
|
||||
expect(html).toMatchInlineSnapshot(`
|
||||
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
||||
<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-files-diff">
|
||||
<div class="d2h-file-side-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-info"></td>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-side-line"><a href="http://example.com">Custom link to render</a></div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d2h-file-side-diff">
|
||||
<div class="d2h-code-wrapper">
|
||||
<table class="d2h-diff-table">
|
||||
<tbody class="d2h-diff-tbody">
|
||||
<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-info"></td>
|
||||
<td class="d2h-info">
|
||||
<div class="d2h-code-side-line"> </div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>"
|
||||
`);
|
||||
});
|
||||
});
|
||||
|
||||
describe('processLines', () => {
|
||||
|
|
@ -508,26 +425,26 @@ describe('SideBySideRenderer', () => {
|
|||
const html = sideBySideRenderer.processChangedLines(false, oldLines, newLines);
|
||||
|
||||
expect(html).toMatchInlineSnapshot(`
|
||||
{
|
||||
Object {
|
||||
"left": "<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-del d2h-change">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-del d2h-change\\">
|
||||
1
|
||||
</td>
|
||||
<td class="d2h-del d2h-change">
|
||||
<div class="d2h-code-side-line">
|
||||
<span class="d2h-code-line-prefix">-</span>
|
||||
<span class="d2h-code-line-ctn"><del>test</del></span>
|
||||
<td class=\\"d2h-del d2h-change\\">
|
||||
<div class=\\"d2h-code-side-line d2h-del d2h-change\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
||||
<span class=\\"d2h-code-line-ctn\\"><del>test</del></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>",
|
||||
"right": "<tr>
|
||||
<td class="d2h-code-side-linenumber d2h-ins d2h-change">
|
||||
<td class=\\"d2h-code-side-linenumber d2h-ins d2h-change\\">
|
||||
1
|
||||
</td>
|
||||
<td class="d2h-ins d2h-change">
|
||||
<div class="d2h-code-side-line">
|
||||
<span class="d2h-code-line-prefix">+</span>
|
||||
<span class="d2h-code-line-ctn"><ins>test1r</ins></span>
|
||||
<td class=\\"d2h-ins d2h-change\\">
|
||||
<div class=\\"d2h-code-side-line d2h-ins d2h-change\\">
|
||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
||||
<span class=\\"d2h-code-line-ctn\\"><ins>test1r</ins></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>",
|
||||
|
|
|
|||
|
|
@ -4,18 +4,18 @@ describe('Utils', () => {
|
|||
describe('escapeForRegExp', () => {
|
||||
it('should escape markdown link text', () => {
|
||||
const result = escapeForRegExp('[Link](https://diff2html.xyz)');
|
||||
expect(result).toBe('\\[Link\\]\\(https:\\/\\/diff2html\\.xyz\\)');
|
||||
expect(result).toEqual('\\[Link\\]\\(https:\\/\\/diff2html\\.xyz\\)');
|
||||
});
|
||||
it('should escape all dangerous characters', () => {
|
||||
const result = escapeForRegExp('-[]/{}()*+?.\\^$|');
|
||||
expect(result).toBe('\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|');
|
||||
expect(result).toEqual('\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|');
|
||||
});
|
||||
});
|
||||
|
||||
describe('unifyPath', () => {
|
||||
it('should unify windows style path', () => {
|
||||
const result = unifyPath('\\Users\\Downloads\\diff.html');
|
||||
expect(result).toBe('/Users/Downloads/diff.html');
|
||||
expect(result).toEqual('/Users/Downloads/diff.html');
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -4,9 +4,6 @@ import { escapeForRegExp } from './utils';
|
|||
export interface DiffParserConfig {
|
||||
srcPrefix?: string;
|
||||
dstPrefix?: string;
|
||||
diffMaxChanges?: number;
|
||||
diffMaxLineLength?: number;
|
||||
diffTooBigMessage?: (fileIndex: number) => string;
|
||||
}
|
||||
|
||||
function getExtension(filename: string, language: string): string {
|
||||
|
|
@ -185,16 +182,12 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
|
|||
}
|
||||
|
||||
/* Create block metadata */
|
||||
// eslint-disable-next-line
|
||||
// @ts-ignore
|
||||
currentBlock = {
|
||||
lines: [],
|
||||
// eslint-disable-next-line
|
||||
// @ts-ignore
|
||||
oldStartLine: oldLine,
|
||||
// eslint-disable-next-line
|
||||
// @ts-ignore
|
||||
oldStartLine2: oldLine2,
|
||||
// eslint-disable-next-line
|
||||
// @ts-ignore
|
||||
newStartLine: newLine,
|
||||
header: line,
|
||||
};
|
||||
|
|
@ -272,11 +265,11 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
|
|||
const nxtLine = diffLines[lineIndex + 1];
|
||||
const afterNxtLine = diffLines[lineIndex + 2];
|
||||
|
||||
if (line.startsWith('diff --git') || line.startsWith('diff --combined')) {
|
||||
if (line.startsWith('diff')) {
|
||||
startFile();
|
||||
|
||||
// diff --git a/blocked_delta_results.png b/blocked_delta_results.png
|
||||
const gitDiffStart = /^diff --git "?([a-ciow]\/.+)"? "?([a-ciow]\/.+)"?/;
|
||||
const gitDiffStart = /^diff --git "?(.+)"? "?(.+)"?/;
|
||||
if ((values = gitDiffStart.exec(line))) {
|
||||
possibleOldName = getFilename(values[1], undefined, config.dstPrefix);
|
||||
possibleNewName = getFilename(values[2], undefined, config.srcPrefix);
|
||||
|
|
@ -290,27 +283,11 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
|
|||
return;
|
||||
}
|
||||
|
||||
if (line.startsWith('Binary files') && !currentFile?.isGitDiff) {
|
||||
startFile();
|
||||
const unixDiffBinaryStart = /^Binary files "?([a-ciow]\/.+)"? and "?([a-ciow]\/.+)"? differ/;
|
||||
if ((values = unixDiffBinaryStart.exec(line))) {
|
||||
possibleOldName = getFilename(values[1], undefined, config.dstPrefix);
|
||||
possibleNewName = getFilename(values[2], undefined, config.srcPrefix);
|
||||
}
|
||||
|
||||
if (currentFile === null) {
|
||||
throw new Error('Where is my file !!!');
|
||||
}
|
||||
|
||||
currentFile.isBinary = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
!currentFile || // If we do not have a file yet, we should crete one
|
||||
(!currentFile.isGitDiff &&
|
||||
currentFile && // If we already have some file in progress and
|
||||
line.startsWith(oldFileNameHeader) && // If we get to an old file path header line
|
||||
currentFile && // If we already have some file in progress and
|
||||
line.startsWith(oldFileNameHeader) && // If we get to an old file path header line
|
||||
// And is followed by the new file path header line and the hunk header line
|
||||
nxtLine.startsWith(newFileNameHeader) &&
|
||||
afterNxtLine.startsWith(hunkHeaderPrefix))
|
||||
|
|
@ -318,31 +295,6 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
|
|||
startFile();
|
||||
}
|
||||
|
||||
// Ignore remaining diff for current file if marked as too big
|
||||
if (currentFile?.isTooBig) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (
|
||||
currentFile &&
|
||||
((typeof config.diffMaxChanges === 'number' &&
|
||||
currentFile.addedLines + currentFile.deletedLines > config.diffMaxChanges) ||
|
||||
(typeof config.diffMaxLineLength === 'number' && line.length > config.diffMaxLineLength))
|
||||
) {
|
||||
currentFile.isTooBig = true;
|
||||
currentFile.addedLines = 0;
|
||||
currentFile.deletedLines = 0;
|
||||
currentFile.blocks = [];
|
||||
currentBlock = null;
|
||||
|
||||
const message =
|
||||
typeof config.diffTooBigMessage === 'function'
|
||||
? config.diffTooBigMessage(files.length)
|
||||
: 'Diff too big to be displayed';
|
||||
startBlock(message);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to make sure that we have the three lines of the header.
|
||||
* This avoids cases like the ones described in:
|
||||
|
|
@ -458,16 +410,18 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
|
|||
} else if ((values = index.exec(line))) {
|
||||
currentFile.checksumBefore = values[1];
|
||||
currentFile.checksumAfter = values[2];
|
||||
if (values[3]) currentFile.mode = values[3];
|
||||
values[3] && (currentFile.mode = values[3]);
|
||||
} else if ((values = combinedIndex.exec(line))) {
|
||||
currentFile.checksumBefore = [values[2], values[3]];
|
||||
currentFile.checksumAfter = values[1];
|
||||
} else if ((values = combinedMode.exec(line))) {
|
||||
currentFile.oldMode = [values[2], values[3]];
|
||||
currentFile.newMode = values[1];
|
||||
// eslint-disable-next-line sonarjs/no-duplicated-branches
|
||||
} else if ((values = combinedNewFile.exec(line))) {
|
||||
currentFile.newFileMode = values[1];
|
||||
currentFile.isNew = true;
|
||||
// eslint-disable-next-line sonarjs/no-duplicated-branches
|
||||
} else if ((values = combinedDeletedFile.exec(line))) {
|
||||
currentFile.deletedFileMode = values[1];
|
||||
currentFile.isDeleted = true;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import * as DiffParser from './diff-parser';
|
||||
import { FileListRenderer } from './file-list-renderer';
|
||||
import * as fileListPrinter from './file-list-renderer';
|
||||
import LineByLineRenderer, { LineByLineRendererConfig, defaultLineByLineRendererConfig } from './line-by-line-renderer';
|
||||
import SideBySideRenderer, { SideBySideRendererConfig, defaultSideBySideRendererConfig } from './side-by-side-renderer';
|
||||
import { DiffFile, OutputFormatType } from './types';
|
||||
|
|
@ -32,10 +32,7 @@ export function html(diffInput: string | DiffFile[], configuration: Diff2HtmlCon
|
|||
|
||||
const hoganUtils = new HoganJsUtils(config);
|
||||
|
||||
const { colorScheme } = config;
|
||||
const fileListRendererConfig = { colorScheme };
|
||||
|
||||
const fileList = config.drawFileList ? new FileListRenderer(hoganUtils, fileListRendererConfig).render(diffJson) : '';
|
||||
const fileList = config.drawFileList ? fileListPrinter.render(diffJson, hoganUtils) : '';
|
||||
|
||||
const diffOutput =
|
||||
config.outputFormat === 'side-by-side'
|
||||
|
|
|
|||
|
|
@ -1,52 +1,33 @@
|
|||
import * as renderUtils from './render-utils';
|
||||
import HoganJsUtils from './hoganjs-utils';
|
||||
import { ColorSchemeType, DiffFile } from './types';
|
||||
import { DiffFile } from './types';
|
||||
|
||||
const baseTemplatesPath = 'file-summary';
|
||||
const iconsBaseTemplatesPath = 'icon';
|
||||
|
||||
export interface FileListRendererConfig {
|
||||
colorScheme?: ColorSchemeType;
|
||||
}
|
||||
|
||||
export const defaultFileListRendererConfig = {
|
||||
colorScheme: renderUtils.defaultRenderConfig.colorScheme,
|
||||
};
|
||||
|
||||
export class FileListRenderer {
|
||||
private readonly hoganUtils: HoganJsUtils;
|
||||
private readonly config: typeof defaultFileListRendererConfig;
|
||||
|
||||
constructor(hoganUtils: HoganJsUtils, config: FileListRendererConfig = {}) {
|
||||
this.hoganUtils = hoganUtils;
|
||||
this.config = { ...defaultFileListRendererConfig, ...config };
|
||||
}
|
||||
|
||||
render(diffFiles: DiffFile[]): string {
|
||||
const files = diffFiles
|
||||
.map(file =>
|
||||
this.hoganUtils.render(
|
||||
baseTemplatesPath,
|
||||
'line',
|
||||
{
|
||||
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,
|
||||
});
|
||||
}
|
||||
export function render(diffFiles: DiffFile[], hoganUtils: HoganJsUtils): string {
|
||||
const files = diffFiles
|
||||
.map(file =>
|
||||
hoganUtils.render(
|
||||
baseTemplatesPath,
|
||||
'line',
|
||||
{
|
||||
fileHtmlId: renderUtils.getHtmlId(file),
|
||||
oldName: file.oldName,
|
||||
newName: file.newName,
|
||||
fileName: renderUtils.filenameDiff(file),
|
||||
deletedLines: '-' + file.deletedLines,
|
||||
addedLines: '+' + file.addedLines,
|
||||
},
|
||||
{
|
||||
fileIcon: hoganUtils.template(iconsBaseTemplatesPath, renderUtils.getFileIcon(file)),
|
||||
},
|
||||
),
|
||||
)
|
||||
.join('\n');
|
||||
|
||||
return hoganUtils.render(baseTemplatesPath, 'wrapper', {
|
||||
filesNumber: diffFiles.length,
|
||||
files: files,
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ export default class HoganJsUtils {
|
|||
try {
|
||||
const template = this.preCompiledTemplates[templateKey];
|
||||
return template.render(params, partials, indent);
|
||||
} catch (_e) {
|
||||
} catch (e) {
|
||||
throw new Error(`Could not find template to render '${templateKey}'`);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,10 +52,7 @@ export default class LineByLineRenderer {
|
|||
})
|
||||
.join('\n');
|
||||
|
||||
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', {
|
||||
colorScheme: renderUtils.colorSchemeToCss(this.config.colorScheme),
|
||||
content: diffsHtml,
|
||||
});
|
||||
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', { content: diffsHtml });
|
||||
}
|
||||
|
||||
makeFileDiffHtml(file: DiffFile, diffs: string): string {
|
||||
|
|
@ -98,7 +95,7 @@ export default class LineByLineRenderer {
|
|||
.map(block => {
|
||||
let lines = this.hoganUtils.render(genericTemplatesPath, 'block-header', {
|
||||
CSSLineClass: renderUtils.CSSLineClass,
|
||||
blockHeader: file.isTooBig ? block.header : renderUtils.escapeForHtml(block.header),
|
||||
blockHeader: block.header,
|
||||
lineClass: 'd2h-code-linenumber',
|
||||
contentClass: 'd2h-code-line',
|
||||
});
|
||||
|
|
@ -106,14 +103,14 @@ export default class LineByLineRenderer {
|
|||
this.applyLineGroupping(block).forEach(([contextLines, oldLines, newLines]) => {
|
||||
if (oldLines.length && newLines.length && !contextLines.length) {
|
||||
this.applyRematchMatching(oldLines, newLines, matcher).map(([oldLines, newLines]) => {
|
||||
const { left, right } = this.processChangedLines(file, file.isCombined, oldLines, newLines);
|
||||
const { left, right } = this.processChangedLines(file.isCombined, oldLines, newLines);
|
||||
lines += left;
|
||||
lines += right;
|
||||
});
|
||||
} else if (contextLines.length) {
|
||||
contextLines.forEach(line => {
|
||||
const { prefix, content } = renderUtils.deconstructLine(line.content, file.isCombined);
|
||||
lines += this.generateSingleLineHtml(file, {
|
||||
lines += this.generateSingleLineHtml({
|
||||
type: renderUtils.CSSLineClass.CONTEXT,
|
||||
prefix: prefix,
|
||||
content: content,
|
||||
|
|
@ -122,7 +119,7 @@ export default class LineByLineRenderer {
|
|||
});
|
||||
});
|
||||
} else if (oldLines.length || newLines.length) {
|
||||
const { left, right } = this.processChangedLines(file, file.isCombined, oldLines, newLines);
|
||||
const { left, right } = this.processChangedLines(file.isCombined, oldLines, newLines);
|
||||
lines += left;
|
||||
lines += right;
|
||||
} else {
|
||||
|
|
@ -191,7 +188,7 @@ export default class LineByLineRenderer {
|
|||
return doMatching ? matcher(oldLines, newLines) : [[oldLines, newLines]];
|
||||
}
|
||||
|
||||
processChangedLines(file: DiffFile, isCombined: boolean, oldLines: DiffLine[], newLines: DiffLine[]): FileHtml {
|
||||
processChangedLines(isCombined: boolean, oldLines: DiffLine[], newLines: DiffLine[]): FileHtml {
|
||||
const fileHtml = {
|
||||
right: '',
|
||||
left: '',
|
||||
|
|
@ -243,7 +240,7 @@ export default class LineByLineRenderer {
|
|||
}
|
||||
: undefined;
|
||||
|
||||
const { left, right } = this.generateLineHtml(file, preparedOldLine, preparedNewLine);
|
||||
const { left, right } = this.generateLineHtml(preparedOldLine, preparedNewLine);
|
||||
fileHtml.left += left;
|
||||
fileHtml.right += right;
|
||||
}
|
||||
|
|
@ -251,14 +248,14 @@ export default class LineByLineRenderer {
|
|||
return fileHtml;
|
||||
}
|
||||
|
||||
generateLineHtml(file: DiffFile, oldLine?: DiffPreparedLine, newLine?: DiffPreparedLine): FileHtml {
|
||||
generateLineHtml(oldLine?: DiffPreparedLine, newLine?: DiffPreparedLine): FileHtml {
|
||||
return {
|
||||
left: this.generateSingleLineHtml(file, oldLine),
|
||||
right: this.generateSingleLineHtml(file, newLine),
|
||||
left: this.generateSingleLineHtml(oldLine),
|
||||
right: this.generateSingleLineHtml(newLine),
|
||||
};
|
||||
}
|
||||
|
||||
generateSingleLineHtml(file: DiffFile, line?: DiffPreparedLine): string {
|
||||
generateSingleLineHtml(line?: DiffPreparedLine): string {
|
||||
if (line === undefined) return '';
|
||||
|
||||
const lineNumberHtml = this.hoganUtils.render(baseTemplatesPath, 'numbers', {
|
||||
|
|
@ -273,8 +270,6 @@ export default class LineByLineRenderer {
|
|||
prefix: line.prefix === ' ' ? ' ' : line.prefix,
|
||||
content: line.content,
|
||||
lineNumber: lineNumberHtml,
|
||||
line,
|
||||
file,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,15 +2,7 @@ import * as jsDiff from 'diff';
|
|||
|
||||
import { unifyPath, hashCode } from './utils';
|
||||
import * as rematch from './rematch';
|
||||
import {
|
||||
ColorSchemeType,
|
||||
DiffFile,
|
||||
DiffFileName,
|
||||
DiffLineParts,
|
||||
DiffStyleType,
|
||||
LineMatchingType,
|
||||
LineType,
|
||||
} from './types';
|
||||
import { LineMatchingType, DiffStyleType, LineType, DiffLineParts, DiffFile, DiffFileName } from './types';
|
||||
|
||||
export type CSSLineClass =
|
||||
| 'd2h-ins'
|
||||
|
|
@ -45,7 +37,6 @@ export interface RenderConfig {
|
|||
matchWordsThreshold?: number;
|
||||
maxLineLengthHighlight?: number;
|
||||
diffStyle?: DiffStyleType;
|
||||
colorScheme?: ColorSchemeType;
|
||||
}
|
||||
|
||||
export const defaultRenderConfig = {
|
||||
|
|
@ -53,7 +44,6 @@ export const defaultRenderConfig = {
|
|||
matchWordsThreshold: 0.25,
|
||||
maxLineLengthHighlight: 10000,
|
||||
diffStyle: DiffStyleType.WORD,
|
||||
colorScheme: ColorSchemeType.LIGHT,
|
||||
};
|
||||
|
||||
const separator = '/';
|
||||
|
|
@ -86,18 +76,6 @@ 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
|
||||
*/
|
||||
|
|
@ -208,7 +186,9 @@ export function filenameDiff(file: DiffFileName): string {
|
|||
* Generates a unique string numerical identifier based on the names of the file diff
|
||||
*/
|
||||
export function getHtmlId(file: DiffFileName): string {
|
||||
return `d2h-${hashCode(filenameDiff(file)).toString().slice(-6)}`;
|
||||
return `d2h-${hashCode(filenameDiff(file))
|
||||
.toString()
|
||||
.slice(-6)}`;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -251,11 +231,11 @@ export function diffHighlight(
|
|||
return {
|
||||
oldLine: {
|
||||
prefix: line1.prefix,
|
||||
content: escapeForHtml(line1.content),
|
||||
content: line1.content,
|
||||
},
|
||||
newLine: {
|
||||
prefix: line2.prefix,
|
||||
content: escapeForHtml(line2.content),
|
||||
content: line2.content,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,10 +52,7 @@ export default class SideBySideRenderer {
|
|||
})
|
||||
.join('\n');
|
||||
|
||||
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', {
|
||||
colorScheme: renderUtils.colorSchemeToCss(this.config.colorScheme),
|
||||
content: diffsHtml,
|
||||
});
|
||||
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', { content: diffsHtml });
|
||||
}
|
||||
|
||||
makeFileDiffHtml(file: DiffFile, diffs: FileHtml): string {
|
||||
|
|
@ -100,7 +97,7 @@ export default class SideBySideRenderer {
|
|||
return file.blocks
|
||||
.map(block => {
|
||||
const fileHtml = {
|
||||
left: this.makeHeaderHtml(block.header, file),
|
||||
left: this.makeHeaderHtml(block.header),
|
||||
right: this.makeHeaderHtml(''),
|
||||
};
|
||||
|
||||
|
|
@ -206,10 +203,10 @@ export default class SideBySideRenderer {
|
|||
return doMatching ? matcher(oldLines, newLines) : [[oldLines, newLines]];
|
||||
}
|
||||
|
||||
makeHeaderHtml(blockHeader: string, file?: DiffFile): string {
|
||||
makeHeaderHtml(blockHeader: string): string {
|
||||
return this.hoganUtils.render(genericTemplatesPath, 'block-header', {
|
||||
CSSLineClass: renderUtils.CSSLineClass,
|
||||
blockHeader: file?.isTooBig ? blockHeader : renderUtils.escapeForHtml(blockHeader),
|
||||
blockHeader: blockHeader,
|
||||
lineClass: 'd2h-code-side-linenumber',
|
||||
contentClass: 'd2h-code-side-line',
|
||||
});
|
||||
|
|
@ -288,8 +285,8 @@ export default class SideBySideRenderer {
|
|||
type: line?.type || `${renderUtils.CSSLineClass.CONTEXT} d2h-emptyplaceholder`,
|
||||
lineClass: line !== undefined ? lineClass : `${lineClass} d2h-code-side-emptyplaceholder`,
|
||||
contentClass: line !== undefined ? contentClass : `${contentClass} d2h-code-side-emptyplaceholder`,
|
||||
prefix: line?.prefix === ' ' ? ' ' : line?.prefix,
|
||||
content: line?.content,
|
||||
prefix: line?.prefix === ' ' ? ' ' : line?.prefix || ' ',
|
||||
content: line?.content || ' ',
|
||||
lineNumber: line?.number,
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<div class="d2h-file-list-wrapper {{colorScheme}}">
|
||||
<div class="d2h-file-list-wrapper">
|
||||
<div class="d2h-file-list-header">
|
||||
<span class="d2h-file-list-title">Files changed ({{filesNumber}})</span>
|
||||
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<tr>
|
||||
<td class="{{lineClass}} {{CSSLineClass.INFO}}"></td>
|
||||
<td class="{{CSSLineClass.INFO}}">
|
||||
<div class="{{contentClass}}">{{#blockHeader}}{{{blockHeader}}}{{/blockHeader}}{{^blockHeader}} {{/blockHeader}}</div>
|
||||
<div class="{{contentClass}} {{CSSLineClass.INFO}}">{{{blockHeader}}}</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<tr>
|
||||
<td class="{{CSSLineClass.INFO}}">
|
||||
<div class="{{contentClass}}">
|
||||
<div class="{{contentClass}} {{CSSLineClass.INFO}}">
|
||||
File without changes
|
||||
</div>
|
||||
</td>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,3 @@
|
|||
<span class="d2h-file-name">{{fileDiffName}}</span>
|
||||
{{>fileTag}}
|
||||
</span>
|
||||
<label class="d2h-file-collapse">
|
||||
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||||
Viewed
|
||||
</label>
|
||||
|
|
|
|||
|
|
@ -3,19 +3,13 @@
|
|||
{{{lineNumber}}}
|
||||
</td>
|
||||
<td class="{{type}}">
|
||||
<div class="{{contentClass}}">
|
||||
<div class="{{contentClass}} {{type}}">
|
||||
{{#prefix}}
|
||||
<span class="d2h-code-line-prefix">{{{prefix}}}</span>
|
||||
{{/prefix}}
|
||||
{{^prefix}}
|
||||
<span class="d2h-code-line-prefix"> </span>
|
||||
{{/prefix}}
|
||||
{{#content}}
|
||||
<span class="d2h-code-line-ctn">{{{content}}}</span>
|
||||
{{/content}}
|
||||
{{^content}}
|
||||
<span class="d2h-code-line-ctn"><br></span>
|
||||
{{/content}}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
<div class="d2h-wrapper {{colorScheme}}">
|
||||
<div class="d2h-wrapper">
|
||||
{{{content}}}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -62,7 +62,6 @@ export interface DiffFile extends DiffFileName {
|
|||
isCopy?: boolean;
|
||||
isRename?: boolean;
|
||||
isBinary?: boolean;
|
||||
isTooBig?: boolean;
|
||||
unchangedPercentage?: number;
|
||||
changedPercentage?: number;
|
||||
checksumBefore?: string | string[];
|
||||
|
|
@ -91,9 +90,3 @@ export const DiffStyleType: { [_: string]: DiffStyleType } = {
|
|||
WORD: 'word',
|
||||
CHAR: 'char',
|
||||
};
|
||||
|
||||
export enum ColorSchemeType {
|
||||
AUTO = 'auto',
|
||||
DARK = 'dark',
|
||||
LIGHT = 'light',
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,99 +5,15 @@
|
|||
*
|
||||
*/
|
||||
|
||||
: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 {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.d2h-file-header {
|
||||
display: flex;
|
||||
height: 35px;
|
||||
padding: 5px 10px;
|
||||
border-bottom: 1px solid var(--d2h-file-header-border-color);
|
||||
background-color: var(--d2h-file-header-bg-color);
|
||||
font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
.d2h-file-header.d2h-sticky-header {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
border-bottom: 1px solid #d8d8d8;
|
||||
background-color: #f7f7f7;
|
||||
}
|
||||
|
||||
.d2h-file-stats {
|
||||
|
|
@ -110,18 +26,18 @@
|
|||
|
||||
.d2h-lines-added {
|
||||
text-align: right;
|
||||
border: 1px solid var(--d2h-ins-border-color);
|
||||
border: 1px solid #b4e2b4;
|
||||
border-radius: 5px 0 0 5px;
|
||||
color: var(--d2h-ins-label-color);
|
||||
color: #399839;
|
||||
padding: 2px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.d2h-lines-deleted {
|
||||
text-align: left;
|
||||
border: 1px solid var(--d2h-del-border-color);
|
||||
border: 1px solid #e9aeae;
|
||||
border-radius: 0 5px 5px 0;
|
||||
color: var(--d2h-del-label-color);
|
||||
color: #c33;
|
||||
padding: 2px;
|
||||
vertical-align: middle;
|
||||
margin-left: 1px;
|
||||
|
|
@ -135,6 +51,7 @@
|
|||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
|
|
@ -145,30 +62,11 @@
|
|||
}
|
||||
|
||||
.d2h-file-wrapper {
|
||||
border: 1px solid var(--d2h-border-color);
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.d2h-file-collapse {
|
||||
justify-content: flex-end;
|
||||
display: none;
|
||||
cursor: pointer;
|
||||
font-size: 12px;
|
||||
align-items: center;
|
||||
border-radius: 3px;
|
||||
border: 1px solid var(--d2h-border-color);
|
||||
padding: 4px 8px;
|
||||
}
|
||||
|
||||
.d2h-file-collapse.d2h-selected {
|
||||
background-color: var(--d2h-selected-color);
|
||||
}
|
||||
|
||||
.d2h-file-collapse-input {
|
||||
margin: 0 4px 0 0;
|
||||
}
|
||||
|
||||
.d2h-diff-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
|
|
@ -177,31 +75,27 @@
|
|||
}
|
||||
|
||||
.d2h-files-diff {
|
||||
display: flex;
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.d2h-file-diff {
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
.d2h-files-diff.d2h-d-none,
|
||||
.d2h-file-diff.d2h-d-none {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.d2h-file-side-diff {
|
||||
display: inline-block;
|
||||
overflow-x: scroll;
|
||||
overflow-y: hidden;
|
||||
width: 50%;
|
||||
margin-right: -4px;
|
||||
margin-bottom: -8px;
|
||||
}
|
||||
|
||||
.d2h-code-line {
|
||||
display: inline-block;
|
||||
white-space: nowrap;
|
||||
user-select: none;
|
||||
width: calc(100% - 16em);
|
||||
/* Compensate for the absolute positioning of the line numbers */
|
||||
padding: 0 8em;
|
||||
}
|
||||
|
|
@ -209,29 +103,16 @@
|
|||
.d2h-code-side-line {
|
||||
display: inline-block;
|
||||
white-space: nowrap;
|
||||
user-select: none;
|
||||
width: calc(100% - 9em);
|
||||
/* Compensate for the absolute positioning of the line numbers */
|
||||
padding: 0 4.5em;
|
||||
}
|
||||
|
||||
.d2h-code-line-ctn {
|
||||
display: inline-block;
|
||||
background: none;
|
||||
padding: 0;
|
||||
word-wrap: normal;
|
||||
white-space: pre;
|
||||
user-select: text;
|
||||
width: 100%;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.d2h-code-line del,
|
||||
.d2h-code-side-line del {
|
||||
display: inline-block;
|
||||
margin-top: -1px;
|
||||
text-decoration: none;
|
||||
background-color: var(--d2h-del-highlight-bg-color);
|
||||
background-color: #ffb6ba;
|
||||
border-radius: 0.2em;
|
||||
}
|
||||
|
||||
|
|
@ -240,7 +121,7 @@
|
|||
display: inline-block;
|
||||
margin-top: -1px;
|
||||
text-decoration: none;
|
||||
background-color: var(--d2h-ins-highlight-bg-color);
|
||||
background-color: #97f295;
|
||||
border-radius: 0.2em;
|
||||
text-align: left;
|
||||
}
|
||||
|
|
@ -253,6 +134,14 @@
|
|||
white-space: pre;
|
||||
}
|
||||
|
||||
.d2h-code-line-ctn {
|
||||
display: inline;
|
||||
background: none;
|
||||
padding: 0;
|
||||
word-wrap: normal;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
.line-num1 {
|
||||
box-sizing: border-box;
|
||||
float: left;
|
||||
|
|
@ -277,10 +166,10 @@
|
|||
/* Keep the numbers fixed on line contents scroll */
|
||||
position: absolute;
|
||||
display: inline-block;
|
||||
background-color: var(--d2h-bg-color);
|
||||
color: var(--d2h-dim-color);
|
||||
background-color: #fff;
|
||||
color: rgba(0, 0, 0, 0.3);
|
||||
text-align: right;
|
||||
border: solid var(--d2h-line-border-color);
|
||||
border: solid #eeeeee;
|
||||
border-width: 0 1px 0 1px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
|
@ -295,15 +184,14 @@
|
|||
display: inline-block;
|
||||
box-sizing: border-box;
|
||||
width: 4em;
|
||||
background-color: var(--d2h-bg-color);
|
||||
color: var(--d2h-dim-color);
|
||||
background-color: #fff;
|
||||
color: rgba(0, 0, 0, 0.3);
|
||||
text-align: right;
|
||||
border: solid var(--d2h-line-border-color);
|
||||
border: solid #eeeeee;
|
||||
border-width: 0 1px 0 1px;
|
||||
cursor: pointer;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
padding: 0 0.5em 0 0.5em;
|
||||
}
|
||||
|
||||
.d2h-code-side-linenumber:after {
|
||||
|
|
@ -312,20 +200,8 @@
|
|||
|
||||
.d2h-code-side-emptyplaceholder,
|
||||
.d2h-emptyplaceholder {
|
||||
background-color: var(--d2h-empty-placeholder-bg-color);
|
||||
border-color: var(--d2h-empty-placeholder-border-color);
|
||||
}
|
||||
|
||||
.d2h-code-linenumber,
|
||||
.d2h-code-side-linenumber,
|
||||
.d2h-code-line-prefix,
|
||||
.d2h-emptyplaceholder {
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.d2h-code-linenumber,
|
||||
.d2h-code-side-linenumber {
|
||||
direction: rtl;
|
||||
background-color: #f1f1f1;
|
||||
border-color: #e1e1e1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -333,27 +209,27 @@
|
|||
*/
|
||||
|
||||
.d2h-del {
|
||||
background-color: var(--d2h-del-bg-color);
|
||||
border-color: var(--d2h-del-border-color);
|
||||
background-color: #fee8e9;
|
||||
border-color: #e9aeae;
|
||||
}
|
||||
|
||||
.d2h-ins {
|
||||
background-color: var(--d2h-ins-bg-color);
|
||||
border-color: var(--d2h-ins-border-color);
|
||||
background-color: #dfd;
|
||||
border-color: #b4e2b4;
|
||||
}
|
||||
|
||||
.d2h-info {
|
||||
background-color: var(--d2h-info-bg-color);
|
||||
color: var(--d2h-dim-color);
|
||||
border-color: var(--d2h-info-border-color);
|
||||
background-color: #f8fafd;
|
||||
color: rgba(0, 0, 0, 0.3);
|
||||
border-color: #d5e4f2;
|
||||
}
|
||||
|
||||
.d2h-file-diff .d2h-del.d2h-change {
|
||||
background-color: var(--d2h-change-del-color);
|
||||
background-color: #fdf2d0;
|
||||
}
|
||||
|
||||
.d2h-file-diff .d2h-ins.d2h-change {
|
||||
background-color: var(--d2h-change-ins-color);
|
||||
background-color: #ded;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -366,11 +242,11 @@
|
|||
|
||||
.d2h-file-list-wrapper a {
|
||||
text-decoration: none;
|
||||
color: var(--d2h-moved-label-color);
|
||||
color: #3572b0;
|
||||
}
|
||||
|
||||
.d2h-file-list-wrapper a:visited {
|
||||
color: var(--d2h-moved-label-color);
|
||||
color: #3572b0;
|
||||
}
|
||||
|
||||
.d2h-file-list-header {
|
||||
|
|
@ -396,7 +272,7 @@
|
|||
}
|
||||
|
||||
.d2h-file-list > li {
|
||||
border-bottom: var(--d2h-border-color) solid 1px;
|
||||
border-bottom: #ddd solid 1px;
|
||||
padding: 5px 10px;
|
||||
margin: 0;
|
||||
}
|
||||
|
|
@ -418,19 +294,19 @@
|
|||
}
|
||||
|
||||
.d2h-deleted {
|
||||
color: var(--d2h-del-label-color);
|
||||
color: #c33;
|
||||
}
|
||||
|
||||
.d2h-added {
|
||||
color: var(--d2h-ins-label-color);
|
||||
color: #399839;
|
||||
}
|
||||
|
||||
.d2h-changed {
|
||||
color: var(--d2h-change-label-color);
|
||||
color: #d0b44c;
|
||||
}
|
||||
|
||||
.d2h-moved {
|
||||
color: var(--d2h-moved-label-color);
|
||||
color: #3572b0;
|
||||
}
|
||||
|
||||
.d2h-tag {
|
||||
|
|
@ -440,302 +316,60 @@
|
|||
font-size: 10px;
|
||||
margin-left: 5px;
|
||||
padding: 0 2px;
|
||||
background-color: var(--d2h-bg-color);
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.d2h-deleted-tag {
|
||||
border: var(--d2h-del-label-color) 1px solid;
|
||||
border: #c33 1px solid;
|
||||
}
|
||||
|
||||
.d2h-added-tag {
|
||||
border: var(--d2h-ins-label-color) 1px solid;
|
||||
border: #399839 1px solid;
|
||||
}
|
||||
|
||||
.d2h-changed-tag {
|
||||
border: var(--d2h-change-label-color) 1px solid;
|
||||
border: #d0b44c 1px solid;
|
||||
}
|
||||
|
||||
.d2h-moved-tag {
|
||||
border: var(--d2h-moved-label-color) 1px solid;
|
||||
border: #3572b0 1px solid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dark Mode Colors
|
||||
/*
|
||||
* Selection util.
|
||||
*/
|
||||
|
||||
.d2h-dark-color-scheme {
|
||||
color: var(--d2h-dark-color);
|
||||
background-color: var(--d2h-dark-bg-color);
|
||||
.selecting-left .d2h-code-line,
|
||||
.selecting-left .d2h-code-line *,
|
||||
.selecting-right td.d2h-code-linenumber,
|
||||
.selecting-right td.d2h-code-linenumber *,
|
||||
.selecting-left .d2h-code-side-line,
|
||||
.selecting-left .d2h-code-side-line *,
|
||||
.selecting-right td.d2h-code-side-linenumber,
|
||||
.selecting-right td.d2h-code-side-linenumber * {
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.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);
|
||||
.selecting-left .d2h-code-line::-moz-selection,
|
||||
.selecting-left .d2h-code-line *::-moz-selection,
|
||||
.selecting-right td.d2h-code-linenumber::-moz-selection,
|
||||
.selecting-left .d2h-code-side-line::-moz-selection,
|
||||
.selecting-left .d2h-code-side-line *::-moz-selection,
|
||||
.selecting-right td.d2h-code-side-linenumber::-moz-selection,
|
||||
.selecting-right td.d2h-code-side-linenumber *::-moz-selection {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
.selecting-left .d2h-code-line::selection,
|
||||
.selecting-left .d2h-code-line *::selection,
|
||||
.selecting-right td.d2h-code-linenumber::selection,
|
||||
.selecting-left .d2h-code-side-line::selection,
|
||||
.selecting-left .d2h-code-side-line *::selection,
|
||||
.selecting-right td.d2h-code-side-linenumber::selection,
|
||||
.selecting-right td.d2h-code-side-linenumber *::selection {
|
||||
background: transparent;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,22 +1,16 @@
|
|||
import { closeTags, nodeStream, mergeStreams, getLanguage } from './highlight.js-helpers';
|
||||
import * as HighlightJS from 'highlight.js/lib/highlight.js';
|
||||
import { ICompiledMode, IHighlightResult, IAutoHighlightResult } from 'highlight.js';
|
||||
import { nodeStream, mergeStreams } from './highlight.js-helpers';
|
||||
|
||||
import { html, Diff2HtmlConfig, defaultDiff2HtmlConfig } from '../../diff2html';
|
||||
import { DiffFile } from '../../types';
|
||||
import { HighlightResult, HLJSApi } from 'highlight.js';
|
||||
|
||||
export interface Diff2HtmlUIConfig extends Diff2HtmlConfig {
|
||||
synchronisedScroll?: boolean;
|
||||
highlight?: boolean;
|
||||
fileListToggle?: boolean;
|
||||
fileListStartVisible?: boolean;
|
||||
highlightLanguages?: Map<string, string>;
|
||||
/**
|
||||
* @deprecated since version 3.1.0
|
||||
* Smart selection is now enabled by default with vanilla CSS
|
||||
*/
|
||||
smartSelection?: boolean;
|
||||
fileContentToggle?: boolean;
|
||||
stickyFileHeaders?: boolean;
|
||||
}
|
||||
|
||||
export const defaultDiff2HtmlUIConfig = {
|
||||
|
|
@ -25,25 +19,23 @@ export const defaultDiff2HtmlUIConfig = {
|
|||
highlight: true,
|
||||
fileListToggle: true,
|
||||
fileListStartVisible: false,
|
||||
highlightLanguages: new Map<string, string>(),
|
||||
/**
|
||||
* @deprecated since version 3.1.0
|
||||
* Smart selection is now enabled by default with vanilla CSS
|
||||
*/
|
||||
smartSelection: true,
|
||||
fileContentToggle: true,
|
||||
stickyFileHeaders: true,
|
||||
};
|
||||
|
||||
export class Diff2HtmlUI {
|
||||
readonly config: typeof defaultDiff2HtmlUIConfig;
|
||||
readonly diffHtml: string;
|
||||
readonly targetElement: HTMLElement;
|
||||
readonly hljs: HLJSApi | null = null;
|
||||
readonly hljs: typeof HighlightJS | null = null;
|
||||
|
||||
currentSelectionColumnId = -1;
|
||||
|
||||
constructor(target: HTMLElement, diffInput?: string | DiffFile[], config: Diff2HtmlUIConfig = {}, hljs?: HLJSApi) {
|
||||
constructor(
|
||||
target: HTMLElement,
|
||||
diffInput?: string | DiffFile[],
|
||||
config: Diff2HtmlUIConfig = {},
|
||||
hljs?: typeof HighlightJS,
|
||||
) {
|
||||
this.config = { ...defaultDiff2HtmlUIConfig, ...config };
|
||||
this.diffHtml = diffInput !== undefined ? html(diffInput, this.config) : target.innerHTML;
|
||||
this.targetElement = target;
|
||||
|
|
@ -52,11 +44,10 @@ export class Diff2HtmlUI {
|
|||
|
||||
draw(): void {
|
||||
this.targetElement.innerHTML = this.diffHtml;
|
||||
if (this.config.smartSelection) this.smartSelection();
|
||||
if (this.config.synchronisedScroll) this.synchronisedScroll();
|
||||
if (this.config.highlight) this.highlightCode();
|
||||
if (this.config.fileListToggle) this.fileListToggle(this.config.fileListStartVisible);
|
||||
if (this.config.fileContentToggle) this.fileContentToggle();
|
||||
if (this.config.stickyFileHeaders) this.stickyFileHeaders();
|
||||
}
|
||||
|
||||
synchronisedScroll(): void {
|
||||
|
|
@ -82,7 +73,7 @@ export class Diff2HtmlUI {
|
|||
}
|
||||
|
||||
fileListToggle(startVisible: boolean): void {
|
||||
const showBtn: HTMLElement | null = this.targetElement.querySelector('.d2h-show');
|
||||
const showBtn: HTMLElement | null = this.targetElement.querySelector('d2h-show');
|
||||
const hideBtn: HTMLElement | null = this.targetElement.querySelector('.d2h-hide');
|
||||
const fileList: HTMLElement | null = this.targetElement.querySelector('.d2h-file-list');
|
||||
|
||||
|
|
@ -110,73 +101,46 @@ export class Diff2HtmlUI {
|
|||
else hide();
|
||||
}
|
||||
|
||||
fileContentToggle(): void {
|
||||
this.targetElement.querySelectorAll<HTMLElement>('.d2h-file-collapse').forEach(fileContentToggleBtn => {
|
||||
fileContentToggleBtn.style.display = 'flex';
|
||||
|
||||
const toggleFileContents: (selector: string) => void = selector => {
|
||||
const fileContents: HTMLElement | null | undefined = fileContentToggleBtn
|
||||
.closest('.d2h-file-wrapper')
|
||||
?.querySelector(selector);
|
||||
|
||||
if (fileContents !== null && fileContents !== undefined) {
|
||||
fileContentToggleBtn.classList.toggle('d2h-selected');
|
||||
fileContents.classList.toggle('d2h-d-none');
|
||||
}
|
||||
};
|
||||
|
||||
const toggleHandler: (e: Event) => void = e => {
|
||||
if (fileContentToggleBtn === e.target) return;
|
||||
|
||||
toggleFileContents('.d2h-file-diff');
|
||||
toggleFileContents('.d2h-files-diff');
|
||||
};
|
||||
|
||||
fileContentToggleBtn.addEventListener('click', e => toggleHandler(e));
|
||||
});
|
||||
}
|
||||
|
||||
highlightCode(): void {
|
||||
const hljs = this.hljs;
|
||||
if (hljs === null) {
|
||||
if (this.hljs === null) {
|
||||
throw new Error('Missing a `highlight.js` implementation. Please provide one when instantiating Diff2HtmlUI.');
|
||||
}
|
||||
|
||||
// Collect all the diff files and execute the highlight on their lines
|
||||
const files = this.targetElement.querySelectorAll('.d2h-file-wrapper');
|
||||
files.forEach(file => {
|
||||
const language = file.getAttribute('data-lang');
|
||||
|
||||
if (!(this.config.highlightLanguages instanceof Map)) {
|
||||
this.config.highlightLanguages = new Map(Object.entries(this.config.highlightLanguages));
|
||||
}
|
||||
|
||||
let hljsLanguage =
|
||||
language && this.config.highlightLanguages.has(language)
|
||||
? this.config.highlightLanguages.get(language)!
|
||||
: language
|
||||
? getLanguage(language)
|
||||
: 'plaintext';
|
||||
|
||||
// Fallback to plaintext in case language is not loaded
|
||||
if (hljs.getLanguage(hljsLanguage) === undefined) {
|
||||
hljsLanguage = 'plaintext';
|
||||
}
|
||||
let oldLinesState: ICompiledMode;
|
||||
let newLinesState: ICompiledMode;
|
||||
|
||||
// Collect all the code lines and execute the highlight on them
|
||||
const codeLines = file.querySelectorAll('.d2h-code-line-ctn');
|
||||
codeLines.forEach(line => {
|
||||
// HACK: help Typescript know that `this.hljs` is defined since we already checked it
|
||||
if (this.hljs === null) return;
|
||||
|
||||
const text = line.textContent;
|
||||
const lineParent = line.parentNode;
|
||||
|
||||
if (text === null || lineParent === null || !this.isElement(lineParent)) return;
|
||||
|
||||
const result: HighlightResult = closeTags(
|
||||
hljs.highlight(text, {
|
||||
language: hljsLanguage,
|
||||
ignoreIllegals: true,
|
||||
}),
|
||||
);
|
||||
const lineState = lineParent.classList.contains('d2h-del') ? oldLinesState : newLinesState;
|
||||
|
||||
const language = file.getAttribute('data-lang');
|
||||
const result =
|
||||
language && this.hljs.getLanguage(language)
|
||||
? this.hljs.highlight(language, text, true, lineState)
|
||||
: this.hljs.highlightAuto(text);
|
||||
|
||||
if (this.instanceOfIHighlightResult(result)) {
|
||||
if (lineParent.classList.contains('d2h-del')) {
|
||||
oldLinesState = result.top;
|
||||
} else if (lineParent.classList.contains('d2h-ins')) {
|
||||
newLinesState = result.top;
|
||||
} else {
|
||||
oldLinesState = result.top;
|
||||
newLinesState = result.top;
|
||||
}
|
||||
}
|
||||
|
||||
const originalStream = nodeStream(line);
|
||||
if (originalStream.length) {
|
||||
|
|
@ -186,25 +150,48 @@ export class Diff2HtmlUI {
|
|||
}
|
||||
|
||||
line.classList.add('hljs');
|
||||
if (result.language) {
|
||||
line.classList.add(result.language);
|
||||
}
|
||||
line.classList.add(result.language);
|
||||
line.innerHTML = result.value;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
stickyFileHeaders(): void {
|
||||
this.targetElement.querySelectorAll('.d2h-file-header').forEach(header => {
|
||||
header.classList.add('d2h-sticky-header');
|
||||
smartSelection(): void {
|
||||
const body = document.getElementsByTagName('body')[0];
|
||||
const diffTable = body.getElementsByClassName('d2h-diff-table')[0];
|
||||
|
||||
diffTable.addEventListener('mousedown', event => {
|
||||
if (event === null || !this.isElement(event.target)) return;
|
||||
|
||||
const table = event.target.closest('.d2h-diff-table');
|
||||
if (table !== null) {
|
||||
if (event.target.closest('.d2h-code-line,.d2h-code-side-line') !== null) {
|
||||
table.classList.remove('selecting-left');
|
||||
table.classList.add('selecting-right');
|
||||
this.currentSelectionColumnId = 1;
|
||||
} else if (event.target.closest('.d2h-code-linenumber,.d2h-code-side-linenumber') !== null) {
|
||||
table.classList.remove('selecting-right');
|
||||
table.classList.add('selecting-left');
|
||||
this.currentSelectionColumnId = 0;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
diffTable.addEventListener('copy', event => {
|
||||
if (!this.isClipboardEvent(event)) return;
|
||||
|
||||
const clipboardData = event.clipboardData;
|
||||
const text = this.getSelectedText();
|
||||
|
||||
if (clipboardData === null || text === undefined) return;
|
||||
|
||||
clipboardData.setData('text', text);
|
||||
event.preventDefault();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated since version 3.1.0
|
||||
*/
|
||||
smartSelection(): void {
|
||||
console.warn('Smart selection is now enabled by default with CSS. No need to call this method anymore.');
|
||||
private instanceOfIHighlightResult(object: IHighlightResult | IAutoHighlightResult): object is IHighlightResult {
|
||||
return 'top' in object;
|
||||
}
|
||||
|
||||
private getHashTag(): string | null {
|
||||
|
|
@ -219,7 +206,37 @@ export class Diff2HtmlUI {
|
|||
return hashTag;
|
||||
}
|
||||
|
||||
private getSelectedText(): string | undefined {
|
||||
const sel = window.getSelection();
|
||||
|
||||
if (sel === null) return;
|
||||
|
||||
const range = sel.getRangeAt(0);
|
||||
const doc = range.cloneContents();
|
||||
const nodes = doc.querySelectorAll('tr');
|
||||
const idx = this.currentSelectionColumnId;
|
||||
|
||||
let text = '';
|
||||
if (nodes.length === 0) {
|
||||
text = doc.textContent || '';
|
||||
} else {
|
||||
nodes.forEach((tr, i) => {
|
||||
const td = tr.cells[tr.cells.length === 1 ? 0 : idx];
|
||||
|
||||
if (td === undefined || td.textContent === null) return;
|
||||
|
||||
text += (i ? '\n' : '') + td.textContent.replace(/\r\n|\r|\n/g, '');
|
||||
});
|
||||
}
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
private isElement(arg?: unknown): arg is Element {
|
||||
return arg !== null && (arg as Element)?.classList !== undefined;
|
||||
}
|
||||
|
||||
private isClipboardEvent(arg?: unknown): arg is ClipboardEvent {
|
||||
return arg !== null && (arg as ClipboardEvent)?.clipboardData !== undefined;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,5 +9,4 @@ export class Diff2HtmlUI extends Diff2HtmlUIBase {
|
|||
}
|
||||
}
|
||||
|
||||
export { defaultDiff2HtmlUIConfig };
|
||||
export type { Diff2HtmlUIConfig };
|
||||
export { Diff2HtmlUIConfig, defaultDiff2HtmlUIConfig };
|
||||
|
|
|
|||
|
|
@ -9,5 +9,4 @@ export class Diff2HtmlUI extends Diff2HtmlUIBase {
|
|||
}
|
||||
}
|
||||
|
||||
export { defaultDiff2HtmlUIConfig };
|
||||
export type { Diff2HtmlUIConfig };
|
||||
export { Diff2HtmlUIConfig, defaultDiff2HtmlUIConfig };
|
||||
|
|
|
|||
|
|
@ -3,12 +3,13 @@
|
|||
* Used to highlight selected html elements using context
|
||||
*/
|
||||
|
||||
import { HighlightResult } from 'highlight.js';
|
||||
|
||||
/* Utility functions */
|
||||
|
||||
function escapeHTML(value: string): string {
|
||||
return value.replace(/&/gm, '&').replace(/</gm, '<').replace(/>/gm, '>');
|
||||
function escape(value: string): string {
|
||||
return value
|
||||
.replace(/&/gm, '&')
|
||||
.replace(/</gm, '<')
|
||||
.replace(/>/gm, '>');
|
||||
}
|
||||
|
||||
function tag(node: Node): string {
|
||||
|
|
@ -96,7 +97,7 @@ export function mergeStreams(original: NodeEvent[], highlighted: NodeEvent[], va
|
|||
}
|
||||
|
||||
result += `<${tag(node)} ${Array<Attr>()
|
||||
.map.call(node.attributes, attr => `${attr.nodeName}="${escapeHTML(attr.value).replace(/"/g, '"')}"`)
|
||||
.map.call(node.attributes, attr => `${attr.nodeName}="${escape(attr.value)}"`)
|
||||
.join(' ')}>`;
|
||||
}
|
||||
|
||||
|
|
@ -110,7 +111,7 @@ export function mergeStreams(original: NodeEvent[], highlighted: NodeEvent[], va
|
|||
|
||||
while (original.length || highlighted.length) {
|
||||
let stream = selectStream();
|
||||
result += escapeHTML(value.substring(processed, stream[0].offset));
|
||||
result += escape(value.substring(processed, stream[0].offset));
|
||||
processed = stream[0].offset;
|
||||
if (stream === original) {
|
||||
/*
|
||||
|
|
@ -134,522 +135,5 @@ export function mergeStreams(original: NodeEvent[], highlighted: NodeEvent[], va
|
|||
render(stream.splice(0, 1)[0]);
|
||||
}
|
||||
}
|
||||
|
||||
return result + escapeHTML(value.substr(processed));
|
||||
}
|
||||
|
||||
// https://github.com/hexojs/hexo-util/blob/979873b63a725377c2bd6ad834d790023496130d/lib/highlight.js#L123
|
||||
export function closeTags(res: HighlightResult): HighlightResult {
|
||||
const tokenStack = new Array<string>();
|
||||
|
||||
res.value = res.value
|
||||
.split('\n')
|
||||
.map(line => {
|
||||
const prepend = tokenStack.map(token => `<span class="${token}">`).join('');
|
||||
const matches = line.matchAll(/(<span class="(.*?)">|<\/span>)/g);
|
||||
Array.from(matches).forEach(match => {
|
||||
if (match[0] === '</span>') tokenStack.shift();
|
||||
else tokenStack.unshift(match[2]);
|
||||
});
|
||||
const append = '</span>'.repeat(tokenStack.length);
|
||||
return prepend + line + append;
|
||||
})
|
||||
.join('\n');
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// Sourced from https://github.com/highlightjs/highlight.js/blob/main/SUPPORTED_LANGUAGES.md and
|
||||
// https://github.com/exercism/v2-website/blob/main/config/initializers/prism.rb#L187-L315
|
||||
const languagesToExt: { [_: string]: string } = {
|
||||
'1c': '1c',
|
||||
abnf: 'abnf',
|
||||
accesslog: 'accesslog',
|
||||
as: 'actionscript',
|
||||
adb: 'ada',
|
||||
ada: 'ada',
|
||||
ads: 'ada',
|
||||
angelscript: 'angelscript',
|
||||
// asc: 'angelscript',
|
||||
apache: 'apache',
|
||||
applescript: 'applescript',
|
||||
scpt: 'applescript',
|
||||
arcade: 'arcade',
|
||||
cpp: 'cpp',
|
||||
hpp: 'cpp',
|
||||
arduino: 'arduino',
|
||||
ino: 'arduino',
|
||||
armasm: 'armasm',
|
||||
arm: 'armasm',
|
||||
xml: 'xml',
|
||||
html: 'xml',
|
||||
xhtml: 'xml',
|
||||
rss: 'xml',
|
||||
atom: 'xml',
|
||||
xjb: 'xml',
|
||||
xsd: 'xml',
|
||||
xsl: 'xml',
|
||||
plist: 'xml',
|
||||
svg: 'xml',
|
||||
asciidoc: 'asciidoc',
|
||||
adoc: 'asciidoc',
|
||||
asc: 'asciidoc',
|
||||
aspectj: 'aspectj',
|
||||
ahk: 'autohotkey',
|
||||
ahkl: 'autohotkey',
|
||||
au3: 'autoit',
|
||||
avrasm: 'avrasm',
|
||||
awk: 'awk',
|
||||
axapta: 'axapta',
|
||||
'x++': 'axapta',
|
||||
bash: 'bash',
|
||||
sh: 'bash',
|
||||
zsh: 'bash',
|
||||
b: 'basic',
|
||||
bnf: 'bnf',
|
||||
bf: 'brainfuck',
|
||||
c: 'c',
|
||||
h: 'c',
|
||||
cats: 'c',
|
||||
idc: 'c',
|
||||
cal: 'cal',
|
||||
capnproto: 'capnproto',
|
||||
capnp: 'capnproto',
|
||||
ceylon: 'ceylon',
|
||||
clean: 'clean',
|
||||
clj: 'clojure',
|
||||
boot: 'clojure',
|
||||
cl2: 'clojure',
|
||||
cljc: 'clojure',
|
||||
cljs: 'clojure',
|
||||
'cljs.hl': 'clojure',
|
||||
cljscm: 'clojure',
|
||||
cljx: 'clojure',
|
||||
hic: 'clojure',
|
||||
'clojure-repl': 'clojure-repl',
|
||||
cmake: 'cmake',
|
||||
'cmake.in': 'cmake',
|
||||
coffee: 'coffeescript',
|
||||
_coffee: 'coffeescript',
|
||||
cake: 'coffeescript',
|
||||
cjsx: 'coffeescript',
|
||||
iced: 'coffeescript',
|
||||
cson: 'coffeescript',
|
||||
coq: 'coq',
|
||||
cos: 'cos',
|
||||
cls: 'cos',
|
||||
crmsh: 'crmsh',
|
||||
crm: 'crmsh',
|
||||
pcmk: 'crmsh',
|
||||
cr: 'crystal',
|
||||
cs: 'csharp',
|
||||
csx: 'csharp',
|
||||
csp: 'csp',
|
||||
css: 'css',
|
||||
d: 'd',
|
||||
di: 'd',
|
||||
md: 'markdown',
|
||||
markdown: 'markdown',
|
||||
mdown: 'markdown',
|
||||
mdwn: 'markdown',
|
||||
mkd: 'markdown',
|
||||
mkdn: 'markdown',
|
||||
mkdown: 'markdown',
|
||||
ronn: 'markdown',
|
||||
workbook: 'markdown',
|
||||
dart: 'dart',
|
||||
dpr: 'delphi',
|
||||
dfm: 'delphi',
|
||||
pas: 'delphi',
|
||||
pascal: 'delphi',
|
||||
diff: 'diff',
|
||||
patch: 'diff',
|
||||
django: 'django',
|
||||
jinja: 'django',
|
||||
dns: 'dns',
|
||||
zone: 'dns',
|
||||
bind: 'dns',
|
||||
dockerfile: 'dockerfile',
|
||||
docker: 'dockerfile',
|
||||
dos: 'dos',
|
||||
bat: 'dos',
|
||||
cmd: 'dos',
|
||||
dsconfig: 'dsconfig',
|
||||
dts: 'dts',
|
||||
dust: 'dust',
|
||||
dst: 'dust',
|
||||
ebnf: 'ebnf',
|
||||
ex: 'elixir',
|
||||
exs: 'elixir',
|
||||
elm: 'elm',
|
||||
rb: 'ruby',
|
||||
builder: 'ruby',
|
||||
eye: 'ruby',
|
||||
gemspec: 'ruby',
|
||||
god: 'ruby',
|
||||
jbuilder: 'ruby',
|
||||
mspec: 'ruby',
|
||||
pluginspec: 'ruby',
|
||||
podspec: 'ruby',
|
||||
rabl: 'ruby',
|
||||
rake: 'ruby',
|
||||
rbuild: 'ruby',
|
||||
rbw: 'ruby',
|
||||
rbx: 'ruby',
|
||||
ru: 'ruby',
|
||||
ruby: 'ruby',
|
||||
spec: 'ruby',
|
||||
thor: 'ruby',
|
||||
watchr: 'ruby',
|
||||
erb: 'erb',
|
||||
'erlang-repl': 'erlang-repl',
|
||||
erl: 'erlang',
|
||||
'app.src': 'erlang',
|
||||
escript: 'erlang',
|
||||
hrl: 'erlang',
|
||||
xrl: 'erlang',
|
||||
yrl: 'erlang',
|
||||
excel: 'excel',
|
||||
xls: 'excel',
|
||||
xlsx: 'excel',
|
||||
fix: 'fix',
|
||||
flix: 'flix',
|
||||
f90: 'fortran',
|
||||
f: 'fortran',
|
||||
f03: 'fortran',
|
||||
f08: 'fortran',
|
||||
f77: 'fortran',
|
||||
f95: 'fortran',
|
||||
for: 'fortran',
|
||||
fpp: 'fortran',
|
||||
fs: 'fsharp',
|
||||
fsx: 'fsharp',
|
||||
gams: 'gams',
|
||||
gms: 'gams',
|
||||
gauss: 'gauss',
|
||||
gss: 'gauss',
|
||||
gcode: 'gcode',
|
||||
nc: 'gcode',
|
||||
gherkin: 'gherkin',
|
||||
glsl: 'glsl',
|
||||
fp: 'glsl',
|
||||
frag: 'glsl',
|
||||
frg: 'glsl',
|
||||
fsh: 'glsl',
|
||||
fshader: 'glsl',
|
||||
geo: 'glsl',
|
||||
geom: 'glsl',
|
||||
glslv: 'glsl',
|
||||
gshader: 'glsl',
|
||||
shader: 'glsl',
|
||||
tesc: 'glsl',
|
||||
tese: 'glsl',
|
||||
vert: 'glsl',
|
||||
vrx: 'glsl',
|
||||
vsh: 'glsl',
|
||||
vshader: 'glsl',
|
||||
gml: 'gml',
|
||||
go: 'go',
|
||||
bal: 'go',
|
||||
golo: 'golo',
|
||||
gololang: 'golo',
|
||||
gradle: 'gradle',
|
||||
groovy: 'groovy',
|
||||
grt: 'groovy',
|
||||
gtpl: 'groovy',
|
||||
gvy: 'groovy',
|
||||
haml: 'haml',
|
||||
'haml.deface': 'haml',
|
||||
handlebars: 'handlebars',
|
||||
hbs: 'handlebars',
|
||||
'html.hbs': 'handlebars',
|
||||
'html.handlebars': 'handlebars',
|
||||
hs: 'haskell',
|
||||
hsc: 'haskell',
|
||||
idr: 'haskell',
|
||||
purs: 'haskell',
|
||||
hx: 'haxe',
|
||||
hxsl: 'haxe',
|
||||
hsp: 'hsp',
|
||||
htmlbars: 'htmlbars',
|
||||
http: 'http',
|
||||
https: 'http',
|
||||
hy: 'hy',
|
||||
inform7: 'inform7',
|
||||
i7: 'inform7',
|
||||
ini: 'ini',
|
||||
toml: 'ini',
|
||||
cfg: 'ini',
|
||||
prefs: 'ini',
|
||||
// properties: 'ini',
|
||||
irpf90: 'irpf90',
|
||||
isbl: 'isbl',
|
||||
java: 'java',
|
||||
jsp: 'java',
|
||||
js: 'javascript',
|
||||
jsx: 'javascript',
|
||||
_js: 'javascript',
|
||||
bones: 'javascript',
|
||||
es: 'javascript',
|
||||
es6: 'javascript',
|
||||
gs: 'javascript',
|
||||
jake: 'javascript',
|
||||
jsb: 'javascript',
|
||||
jscad: 'javascript',
|
||||
jsfl: 'javascript',
|
||||
jsm: 'javascript',
|
||||
jss: 'javascript',
|
||||
mjs: 'javascript',
|
||||
njs: 'javascript',
|
||||
pac: 'javascript',
|
||||
sjs: 'javascript',
|
||||
ssjs: 'javascript',
|
||||
xsjs: 'javascript',
|
||||
xsjslib: 'javascript',
|
||||
cfc: 'javascript',
|
||||
'jboss-cli': 'jboss-cli',
|
||||
json: 'json',
|
||||
avsc: 'json',
|
||||
geojson: 'json',
|
||||
gltf: 'json',
|
||||
'JSON-tmLanguage': 'json',
|
||||
jsonl: 'json',
|
||||
tfstate: 'json',
|
||||
'tfstate.backup': 'json',
|
||||
topojson: 'json',
|
||||
webapp: 'json',
|
||||
webmanifest: 'json',
|
||||
jl: 'julia',
|
||||
'julia-repl': 'julia-repl',
|
||||
kt: 'kotlin',
|
||||
ktm: 'kotlin',
|
||||
kts: 'kotlin',
|
||||
lasso: 'lasso',
|
||||
// ls: 'lasso',
|
||||
lassoscript: 'lasso',
|
||||
tex: 'latex',
|
||||
ldif: 'ldif',
|
||||
leaf: 'leaf',
|
||||
less: 'less',
|
||||
lisp: 'lisp',
|
||||
factor: 'lisp',
|
||||
livecodeserver: 'livecodeserver',
|
||||
ls: 'livescript',
|
||||
_ls: 'livescript',
|
||||
llvm: 'llvm',
|
||||
lsl: 'lsl',
|
||||
lua: 'lua',
|
||||
nse: 'lua',
|
||||
p8: 'lua',
|
||||
pd_lua: 'lua',
|
||||
rbxs: 'lua',
|
||||
wlua: 'lua',
|
||||
mak: 'makefile',
|
||||
make: 'makefile',
|
||||
mk: 'makefile',
|
||||
mkfile: 'makefile',
|
||||
mathematica: 'mathematica',
|
||||
mma: 'mathematica',
|
||||
wl: 'mathematica',
|
||||
matlab: 'matlab',
|
||||
maxima: 'maxima',
|
||||
mel: 'mel',
|
||||
mercury: 'mercury',
|
||||
mipsasm: 'mipsasm',
|
||||
miz: 'mizar',
|
||||
voc: 'mizar',
|
||||
al: 'perl',
|
||||
cgi: 'perl',
|
||||
fcgi: 'perl',
|
||||
perl: 'perl',
|
||||
ph: 'perl',
|
||||
plx: 'perl',
|
||||
pl: 'perl',
|
||||
pm: 'perl',
|
||||
psgi: 'perl',
|
||||
t: 'perl',
|
||||
mojolicious: 'mojolicious',
|
||||
monkey: 'monkey',
|
||||
monkey2: 'monkey',
|
||||
moonscript: 'moonscript',
|
||||
moon: 'moonscript',
|
||||
n1ql: 'n1ql',
|
||||
nginxconf: 'nginx',
|
||||
nim: 'nim',
|
||||
nimrod: 'nim',
|
||||
nix: 'nix',
|
||||
nsi: 'nsis',
|
||||
nsh: 'nsis',
|
||||
m: 'objectivec',
|
||||
objc: 'objectivec',
|
||||
mm: 'objectivec',
|
||||
'obj-c': 'objectivec',
|
||||
'obj-c++': 'objectivec',
|
||||
'objective-c++': 'objectivec',
|
||||
fun: 'ocaml',
|
||||
sig: 'ocaml',
|
||||
// sml: 'ocaml',
|
||||
ml: 'ocaml',
|
||||
mli: 'ocaml',
|
||||
eliom: 'ocaml',
|
||||
eliomi: 'ocaml',
|
||||
ml4: 'ocaml',
|
||||
mll: 'ocaml',
|
||||
mly: 'ocaml',
|
||||
openscad: 'openscad',
|
||||
oxygene: 'oxygene',
|
||||
parser3: 'parser3',
|
||||
pf: 'pf',
|
||||
'pf.conf': 'pf',
|
||||
pgsql: 'pgsql',
|
||||
postgres: 'pgsql',
|
||||
postgresql: 'pgsql',
|
||||
php: 'php',
|
||||
aw: 'php',
|
||||
ctp: 'php',
|
||||
inc: 'php',
|
||||
php3: 'php',
|
||||
php4: 'php',
|
||||
php5: 'php',
|
||||
phps: 'php',
|
||||
phpt: 'php',
|
||||
'php-template': 'php-template',
|
||||
plaintext: 'plaintext',
|
||||
txt: 'plaintext',
|
||||
text: 'plaintext',
|
||||
pony: 'pony',
|
||||
ps: 'powershell',
|
||||
ps1: 'powershell',
|
||||
psd1: 'powershell',
|
||||
psm1: 'powershell',
|
||||
pde: 'processing',
|
||||
profile: 'profile',
|
||||
pro: 'prolog',
|
||||
prolog: 'prolog',
|
||||
yap: 'prolog',
|
||||
properties: 'properties',
|
||||
proto: 'protobuf',
|
||||
puppet: 'puppet',
|
||||
pp: 'puppet',
|
||||
purebasic: 'purebasic',
|
||||
py: 'python',
|
||||
bzl: 'python',
|
||||
gyp: 'python',
|
||||
gypi: 'python',
|
||||
lmi: 'python',
|
||||
py3: 'python',
|
||||
pyde: 'python',
|
||||
pyi: 'python',
|
||||
pyp: 'python',
|
||||
pyt: 'python',
|
||||
pyw: 'python',
|
||||
rpy: 'python',
|
||||
tac: 'python',
|
||||
wsgi: 'python',
|
||||
xpy: 'python',
|
||||
'python-repl': 'python-repl',
|
||||
pycon: 'python-repl',
|
||||
q: 'q',
|
||||
k: 'q',
|
||||
kdb: 'q',
|
||||
qml: 'qml',
|
||||
r: 'r',
|
||||
rd: 'r',
|
||||
rsx: 'r',
|
||||
reasonml: 'reasonml',
|
||||
re: 'reasonml',
|
||||
rib: 'rib',
|
||||
roboconf: 'roboconf',
|
||||
graph: 'roboconf',
|
||||
instances: 'roboconf',
|
||||
routeros: 'routeros',
|
||||
rsl: 'rsl',
|
||||
ruleslanguage: 'ruleslanguage',
|
||||
rs: 'rust',
|
||||
'rs.in': 'rust',
|
||||
sas: 'sas',
|
||||
// pony: 'scala',
|
||||
scala: 'scala',
|
||||
kojo: 'scala',
|
||||
sbt: 'scala',
|
||||
sc: 'scala',
|
||||
scm: 'scheme',
|
||||
sch: 'scheme',
|
||||
sld: 'scheme',
|
||||
sls: 'scheme',
|
||||
sps: 'scheme',
|
||||
ss: 'scheme',
|
||||
rkt: 'scheme',
|
||||
scilab: 'scilab',
|
||||
scss: 'scss',
|
||||
shell: 'shell',
|
||||
smali: 'smali',
|
||||
st: 'smalltalk',
|
||||
sml: 'sml',
|
||||
sqf: 'sqf',
|
||||
sql: 'sql',
|
||||
cql: 'sql',
|
||||
ddl: 'sql',
|
||||
mysql: 'sql',
|
||||
prc: 'sql',
|
||||
tab: 'sql',
|
||||
udf: 'sql',
|
||||
viw: 'sql',
|
||||
stan: 'stan',
|
||||
stanfuncs: 'stan',
|
||||
stata: 'stata',
|
||||
step21: 'step21',
|
||||
step: 'step21',
|
||||
stp: 'step21',
|
||||
styl: 'stylus',
|
||||
subunit: 'subunit',
|
||||
swift: 'swift',
|
||||
taggerscript: 'taggerscript',
|
||||
yml: 'yaml',
|
||||
mir: 'yaml',
|
||||
reek: 'yaml',
|
||||
rviz: 'yaml',
|
||||
'sublime-syntax': 'yaml',
|
||||
syntax: 'yaml',
|
||||
yaml: 'yaml',
|
||||
'yaml-tmlanguage': 'yaml',
|
||||
'yml.mysql': 'yaml',
|
||||
tap: 'tap',
|
||||
tcl: 'tcl',
|
||||
adp: 'tcl',
|
||||
tm: 'tcl',
|
||||
thrift: 'thrift',
|
||||
tp: 'tp',
|
||||
twig: 'twig',
|
||||
craftcms: 'twig',
|
||||
ts: 'typescript',
|
||||
tsx: 'typescript',
|
||||
vala: 'vala',
|
||||
vbnet: 'vbnet',
|
||||
vb: 'vbnet',
|
||||
vbscript: 'vbscript',
|
||||
vbs: 'vbscript',
|
||||
'vbscript-html': 'vbscript-html',
|
||||
v: 'verilog',
|
||||
veo: 'verilog',
|
||||
vhdl: 'vhdl',
|
||||
vhd: 'vhdl',
|
||||
vhf: 'vhdl',
|
||||
vhi: 'vhdl',
|
||||
vho: 'vhdl',
|
||||
vhs: 'vhdl',
|
||||
vht: 'vhdl',
|
||||
vhw: 'vhdl',
|
||||
vim: 'vim',
|
||||
x86asm: 'x86asm',
|
||||
xl: 'xl',
|
||||
xquery: 'xquery',
|
||||
xpath: 'xquery',
|
||||
xq: 'xquery',
|
||||
zephir: 'zephir',
|
||||
zep: 'zephir',
|
||||
};
|
||||
|
||||
export function getLanguage(fileExtension: string): string {
|
||||
return languagesToExt[fileExtension] ?? 'plaintext';
|
||||
return result + escape(value.substr(processed));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
// Require the highlight.js library without languages
|
||||
import highlightJS from 'highlight.js/lib/core';
|
||||
import highlightJS from 'highlight.js/lib/highlight.js';
|
||||
|
||||
// Convert to imports
|
||||
// ^hljs\.registerLanguage\('(.+)', require\('\./languages\/(.+)'\)\);$
|
||||
// ^highlightJS\.registerLanguage\('(.+)', require\('highlight.js\/lib\/languages\/(.+)'\)\);$
|
||||
// import $1 from 'highlight.js/lib/languages/$2';
|
||||
|
||||
// import _1c from 'highlight.js/lib/languages/1c';
|
||||
// import 1c from 'highlight.js/lib/languages/1c';
|
||||
// import abnf from 'highlight.js/lib/languages/abnf';
|
||||
// import accesslog from 'highlight.js/lib/languages/accesslog';
|
||||
// import actionscript from 'highlight.js/lib/languages/actionscript';
|
||||
|
|
@ -29,28 +29,27 @@ import bash from 'highlight.js/lib/languages/bash';
|
|||
// import basic from 'highlight.js/lib/languages/basic';
|
||||
// import bnf from 'highlight.js/lib/languages/bnf';
|
||||
// import brainfuck from 'highlight.js/lib/languages/brainfuck';
|
||||
import c from 'highlight.js/lib/languages/c';
|
||||
// import cal from 'highlight.js/lib/languages/cal';
|
||||
// import capnproto from 'highlight.js/lib/languages/capnproto';
|
||||
// import ceylon from 'highlight.js/lib/languages/ceylon';
|
||||
// import clean from 'highlight.js/lib/languages/clean';
|
||||
import clojure from 'highlight.js/lib/languages/clojure';
|
||||
// import clojureRepl from 'highlight.js/lib/languages/clojure-repl';
|
||||
// import cmake from 'highlight.js/lib/languages/cmake';
|
||||
// import coffeescript from 'highlight.js/lib/languages/coffeescript';
|
||||
import clojureRepl from 'highlight.js/lib/languages/clojure-repl';
|
||||
import cmake from 'highlight.js/lib/languages/cmake';
|
||||
import coffeescript from 'highlight.js/lib/languages/coffeescript';
|
||||
// import coq from 'highlight.js/lib/languages/coq';
|
||||
// import cos from 'highlight.js/lib/languages/cos';
|
||||
// import crmsh from 'highlight.js/lib/languages/crmsh';
|
||||
import crystal from 'highlight.js/lib/languages/crystal';
|
||||
import csharp from 'highlight.js/lib/languages/csharp';
|
||||
import cs from 'highlight.js/lib/languages/cs';
|
||||
import csp from 'highlight.js/lib/languages/csp';
|
||||
import css from 'highlight.js/lib/languages/css';
|
||||
// import d from 'highlight.js/lib/languages/d';
|
||||
import d from 'highlight.js/lib/languages/d';
|
||||
import markdown from 'highlight.js/lib/languages/markdown';
|
||||
import dart from 'highlight.js/lib/languages/dart';
|
||||
// import delphi from 'highlight.js/lib/languages/delphi';
|
||||
import diff from 'highlight.js/lib/languages/diff';
|
||||
// import django from 'highlight.js/lib/languages/django';
|
||||
import django from 'highlight.js/lib/languages/django';
|
||||
// import dns from 'highlight.js/lib/languages/dns';
|
||||
import dockerfile from 'highlight.js/lib/languages/dockerfile';
|
||||
// import dos from 'highlight.js/lib/languages/dos';
|
||||
|
|
@ -61,10 +60,10 @@ import dockerfile from 'highlight.js/lib/languages/dockerfile';
|
|||
import elixir from 'highlight.js/lib/languages/elixir';
|
||||
import elm from 'highlight.js/lib/languages/elm';
|
||||
import ruby from 'highlight.js/lib/languages/ruby';
|
||||
// import erb from 'highlight.js/lib/languages/erb';
|
||||
// import erlangRepl from 'highlight.js/lib/languages/erlang-repl';
|
||||
import erb from 'highlight.js/lib/languages/erb';
|
||||
import erlangRepl from 'highlight.js/lib/languages/erlang-repl';
|
||||
import erlang from 'highlight.js/lib/languages/erlang';
|
||||
// import excel from 'highlight.js/lib/languages/excel';
|
||||
import excel from 'highlight.js/lib/languages/excel';
|
||||
// import fix from 'highlight.js/lib/languages/fix';
|
||||
// import flix from 'highlight.js/lib/languages/flix';
|
||||
// import fortran from 'highlight.js/lib/languages/fortran';
|
||||
|
|
@ -84,8 +83,8 @@ import handlebars from 'highlight.js/lib/languages/handlebars';
|
|||
import haskell from 'highlight.js/lib/languages/haskell';
|
||||
// import haxe from 'highlight.js/lib/languages/haxe';
|
||||
// import hsp from 'highlight.js/lib/languages/hsp';
|
||||
// import htmlbars from 'highlight.js/lib/languages/htmlbars';
|
||||
// import http from 'highlight.js/lib/languages/http';
|
||||
import htmlbars from 'highlight.js/lib/languages/htmlbars';
|
||||
import http from 'highlight.js/lib/languages/http';
|
||||
// import hy from 'highlight.js/lib/languages/hy';
|
||||
// import inform7 from 'highlight.js/lib/languages/inform7';
|
||||
import ini from 'highlight.js/lib/languages/ini';
|
||||
|
|
@ -93,25 +92,24 @@ import ini from 'highlight.js/lib/languages/ini';
|
|||
// import isbl from 'highlight.js/lib/languages/isbl';
|
||||
import java from 'highlight.js/lib/languages/java';
|
||||
import javascript from 'highlight.js/lib/languages/javascript';
|
||||
// import jbossCli from 'highlight.js/lib/languages/jboss-cli';
|
||||
// import jboss-cli from 'highlight.js/lib/languages/jboss-cli';
|
||||
import json from 'highlight.js/lib/languages/json';
|
||||
// import julia from 'highlight.js/lib/languages/julia';
|
||||
// import juliaRepl from 'highlight.js/lib/languages/julia-repl';
|
||||
import julia from 'highlight.js/lib/languages/julia';
|
||||
import juliaRepl from 'highlight.js/lib/languages/julia-repl';
|
||||
import kotlin from 'highlight.js/lib/languages/kotlin';
|
||||
// import lasso from 'highlight.js/lib/languages/lasso';
|
||||
// import latex from 'highlight.js/lib/languages/latex';
|
||||
// import ldif from 'highlight.js/lib/languages/ldif';
|
||||
// import leaf from 'highlight.js/lib/languages/leaf';
|
||||
import less from 'highlight.js/lib/languages/less';
|
||||
import lisp from 'highlight.js/lib/languages/lisp';
|
||||
// import livecodeserver from 'highlight.js/lib/languages/livecodeserver';
|
||||
// import livescript from 'highlight.js/lib/languages/livescript';
|
||||
// import llvm from 'highlight.js/lib/languages/llvm';
|
||||
import llvm from 'highlight.js/lib/languages/llvm';
|
||||
// import lsl from 'highlight.js/lib/languages/lsl';
|
||||
import lua from 'highlight.js/lib/languages/lua';
|
||||
import makefile from 'highlight.js/lib/languages/makefile';
|
||||
// import mathematica from 'highlight.js/lib/languages/mathematica';
|
||||
// import matlab from 'highlight.js/lib/languages/matlab';
|
||||
import mathematica from 'highlight.js/lib/languages/mathematica';
|
||||
import matlab from 'highlight.js/lib/languages/matlab';
|
||||
// import maxima from 'highlight.js/lib/languages/maxima';
|
||||
// import mel from 'highlight.js/lib/languages/mel';
|
||||
// import mercury from 'highlight.js/lib/languages/mercury';
|
||||
|
|
@ -123,18 +121,17 @@ import perl from 'highlight.js/lib/languages/perl';
|
|||
// import moonscript from 'highlight.js/lib/languages/moonscript';
|
||||
// import n1ql from 'highlight.js/lib/languages/n1ql';
|
||||
import nginx from 'highlight.js/lib/languages/nginx';
|
||||
// import nim from 'highlight.js/lib/languages/nim';
|
||||
// import nix from 'highlight.js/lib/languages/nix';
|
||||
// import nimrod from 'highlight.js/lib/languages/nimrod';
|
||||
import nix from 'highlight.js/lib/languages/nix';
|
||||
// import nsis from 'highlight.js/lib/languages/nsis';
|
||||
import objectivec from 'highlight.js/lib/languages/objectivec';
|
||||
// import ocaml from 'highlight.js/lib/languages/ocaml';
|
||||
import ocaml from 'highlight.js/lib/languages/ocaml';
|
||||
// import openscad from 'highlight.js/lib/languages/openscad';
|
||||
// import oxygene from 'highlight.js/lib/languages/oxygene';
|
||||
// import parser3 from 'highlight.js/lib/languages/parser3';
|
||||
// import pf from 'highlight.js/lib/languages/pf';
|
||||
import pgsql from 'highlight.js/lib/languages/pgsql';
|
||||
import php from 'highlight.js/lib/languages/php';
|
||||
// import phpTemplate from 'highlight.js/lib/languages/php-template';
|
||||
import plaintext from 'highlight.js/lib/languages/plaintext';
|
||||
// import pony from 'highlight.js/lib/languages/pony';
|
||||
import powershell from 'highlight.js/lib/languages/powershell';
|
||||
|
|
@ -143,14 +140,13 @@ import powershell from 'highlight.js/lib/languages/powershell';
|
|||
// import prolog from 'highlight.js/lib/languages/prolog';
|
||||
import properties from 'highlight.js/lib/languages/properties';
|
||||
import protobuf from 'highlight.js/lib/languages/protobuf';
|
||||
// import puppet from 'highlight.js/lib/languages/puppet';
|
||||
import puppet from 'highlight.js/lib/languages/puppet';
|
||||
// import purebasic from 'highlight.js/lib/languages/purebasic';
|
||||
import python from 'highlight.js/lib/languages/python';
|
||||
// import pythonRepl from 'highlight.js/lib/languages/python-repl';
|
||||
// import q from 'highlight.js/lib/languages/q';
|
||||
// import qml from 'highlight.js/lib/languages/qml';
|
||||
// import r from 'highlight.js/lib/languages/r';
|
||||
// import reasonml from 'highlight.js/lib/languages/reasonml';
|
||||
import r from 'highlight.js/lib/languages/r';
|
||||
import reasonml from 'highlight.js/lib/languages/reasonml';
|
||||
// import rib from 'highlight.js/lib/languages/rib';
|
||||
// import roboconf from 'highlight.js/lib/languages/roboconf';
|
||||
// import routeros from 'highlight.js/lib/languages/routeros';
|
||||
|
|
@ -159,7 +155,7 @@ import python from 'highlight.js/lib/languages/python';
|
|||
import rust from 'highlight.js/lib/languages/rust';
|
||||
// import sas from 'highlight.js/lib/languages/sas';
|
||||
import scala from 'highlight.js/lib/languages/scala';
|
||||
// import scheme from 'highlight.js/lib/languages/scheme';
|
||||
import scheme from 'highlight.js/lib/languages/scheme';
|
||||
// import scilab from 'highlight.js/lib/languages/scilab';
|
||||
import scss from 'highlight.js/lib/languages/scss';
|
||||
import shell from 'highlight.js/lib/languages/shell';
|
||||
|
|
@ -171,13 +167,14 @@ import sql from 'highlight.js/lib/languages/sql';
|
|||
// import stan from 'highlight.js/lib/languages/stan';
|
||||
// import stata from 'highlight.js/lib/languages/stata';
|
||||
// import step21 from 'highlight.js/lib/languages/step21';
|
||||
// import stylus from 'highlight.js/lib/languages/stylus';
|
||||
import stylus from 'highlight.js/lib/languages/stylus';
|
||||
// import subunit from 'highlight.js/lib/languages/subunit';
|
||||
import swift from 'highlight.js/lib/languages/swift';
|
||||
// import taggerscript from 'highlight.js/lib/languages/taggerscript';
|
||||
import yaml from 'highlight.js/lib/languages/yaml';
|
||||
// import tap from 'highlight.js/lib/languages/tap';
|
||||
// import tcl from 'highlight.js/lib/languages/tcl';
|
||||
import tex from 'highlight.js/lib/languages/tex';
|
||||
// import thrift from 'highlight.js/lib/languages/thrift';
|
||||
// import tp from 'highlight.js/lib/languages/tp';
|
||||
// import twig from 'highlight.js/lib/languages/twig';
|
||||
|
|
@ -185,21 +182,21 @@ import typescript from 'highlight.js/lib/languages/typescript';
|
|||
// import vala from 'highlight.js/lib/languages/vala';
|
||||
// import vbnet from 'highlight.js/lib/languages/vbnet';
|
||||
// import vbscript from 'highlight.js/lib/languages/vbscript';
|
||||
// import vbscriptHtml from 'highlight.js/lib/languages/vbscript-html';
|
||||
// import vbscript-html from 'highlight.js/lib/languages/vbscript-html';
|
||||
// import verilog from 'highlight.js/lib/languages/verilog';
|
||||
// import vhdl from 'highlight.js/lib/languages/vhdl';
|
||||
// import vim from 'highlight.js/lib/languages/vim';
|
||||
import vim from 'highlight.js/lib/languages/vim';
|
||||
// import x86asm from 'highlight.js/lib/languages/x86asm';
|
||||
// import xl from 'highlight.js/lib/languages/xl';
|
||||
// import xquery from 'highlight.js/lib/languages/xquery';
|
||||
// import zephir from 'highlight.js/lib/languages/zephir';
|
||||
|
||||
// Convert to registerLanguage
|
||||
// ^hljs\.registerLanguage\('(.+)', require\('\./languages\/(.+)'\)\);$
|
||||
// ^highlightJS\.registerLanguage\('(.+)', require\('highlight.js\/lib\/languages\/(.+)'\)\);$
|
||||
// highlightJS.registerLanguage('$1', $1);
|
||||
|
||||
// Separately require languages
|
||||
// highlightJS.registerLanguage('1c', _1c);
|
||||
// highlightJS.registerLanguage('1c', 1c);
|
||||
// highlightJS.registerLanguage('abnf', abnf);
|
||||
// highlightJS.registerLanguage('accesslog', accesslog);
|
||||
// highlightJS.registerLanguage('actionscript', actionscript);
|
||||
|
|
@ -223,28 +220,27 @@ highlightJS.registerLanguage('bash', bash);
|
|||
// highlightJS.registerLanguage('basic', basic);
|
||||
// highlightJS.registerLanguage('bnf', bnf);
|
||||
// highlightJS.registerLanguage('brainfuck', brainfuck);
|
||||
highlightJS.registerLanguage('c', c);
|
||||
// highlightJS.registerLanguage('cal', cal);
|
||||
// highlightJS.registerLanguage('capnproto', capnproto);
|
||||
// highlightJS.registerLanguage('ceylon', ceylon);
|
||||
// highlightJS.registerLanguage('clean', clean);
|
||||
highlightJS.registerLanguage('clojure', clojure);
|
||||
// highlightJS.registerLanguage('clojure-repl', clojureRepl);
|
||||
// highlightJS.registerLanguage('cmake', cmake);
|
||||
// highlightJS.registerLanguage('coffeescript', coffeescript);
|
||||
highlightJS.registerLanguage('clojure-repl', clojureRepl);
|
||||
highlightJS.registerLanguage('cmake', cmake);
|
||||
highlightJS.registerLanguage('coffeescript', coffeescript);
|
||||
// highlightJS.registerLanguage('coq', coq);
|
||||
// highlightJS.registerLanguage('cos', cos);
|
||||
// highlightJS.registerLanguage('crmsh', crmsh);
|
||||
highlightJS.registerLanguage('crystal', crystal);
|
||||
highlightJS.registerLanguage('csharp', csharp);
|
||||
highlightJS.registerLanguage('cs', cs);
|
||||
highlightJS.registerLanguage('csp', csp);
|
||||
highlightJS.registerLanguage('css', css);
|
||||
// highlightJS.registerLanguage('d', d);
|
||||
highlightJS.registerLanguage('d', d);
|
||||
highlightJS.registerLanguage('markdown', markdown);
|
||||
highlightJS.registerLanguage('dart', dart);
|
||||
// highlightJS.registerLanguage('delphi', delphi);
|
||||
highlightJS.registerLanguage('diff', diff);
|
||||
// highlightJS.registerLanguage('django', django);
|
||||
highlightJS.registerLanguage('django', django);
|
||||
// highlightJS.registerLanguage('dns', dns);
|
||||
highlightJS.registerLanguage('dockerfile', dockerfile);
|
||||
// highlightJS.registerLanguage('dos', dos);
|
||||
|
|
@ -255,10 +251,10 @@ highlightJS.registerLanguage('dockerfile', dockerfile);
|
|||
highlightJS.registerLanguage('elixir', elixir);
|
||||
highlightJS.registerLanguage('elm', elm);
|
||||
highlightJS.registerLanguage('ruby', ruby);
|
||||
// highlightJS.registerLanguage('erb', erb);
|
||||
// highlightJS.registerLanguage('erlang-repl', erlangRepl);
|
||||
highlightJS.registerLanguage('erb', erb);
|
||||
highlightJS.registerLanguage('erlang-repl', erlangRepl);
|
||||
highlightJS.registerLanguage('erlang', erlang);
|
||||
// highlightJS.registerLanguage('excel', excel);
|
||||
highlightJS.registerLanguage('excel', excel);
|
||||
// highlightJS.registerLanguage('fix', fix);
|
||||
// highlightJS.registerLanguage('flix', flix);
|
||||
// highlightJS.registerLanguage('fortran', fortran);
|
||||
|
|
@ -278,8 +274,8 @@ highlightJS.registerLanguage('handlebars', handlebars);
|
|||
highlightJS.registerLanguage('haskell', haskell);
|
||||
// highlightJS.registerLanguage('haxe', haxe);
|
||||
// highlightJS.registerLanguage('hsp', hsp);
|
||||
// highlightJS.registerLanguage('htmlbars', htmlbars);
|
||||
// highlightJS.registerLanguage('http', http);
|
||||
highlightJS.registerLanguage('htmlbars', htmlbars);
|
||||
highlightJS.registerLanguage('http', http);
|
||||
// highlightJS.registerLanguage('hy', hy);
|
||||
// highlightJS.registerLanguage('inform7', inform7);
|
||||
highlightJS.registerLanguage('ini', ini);
|
||||
|
|
@ -287,25 +283,24 @@ highlightJS.registerLanguage('ini', ini);
|
|||
// highlightJS.registerLanguage('isbl', isbl);
|
||||
highlightJS.registerLanguage('java', java);
|
||||
highlightJS.registerLanguage('javascript', javascript);
|
||||
// highlightJS.registerLanguage('jboss-cli', jbossCli);
|
||||
// highlightJS.registerLanguage('jboss-cli', jboss-cli);
|
||||
highlightJS.registerLanguage('json', json);
|
||||
// highlightJS.registerLanguage('julia', julia);
|
||||
// highlightJS.registerLanguage('julia-repl', juliaRepl);
|
||||
highlightJS.registerLanguage('julia', julia);
|
||||
highlightJS.registerLanguage('julia-repl', juliaRepl);
|
||||
highlightJS.registerLanguage('kotlin', kotlin);
|
||||
// highlightJS.registerLanguage('lasso', lasso);
|
||||
// highlightJS.registerLanguage('latex', latex);
|
||||
// highlightJS.registerLanguage('ldif', ldif);
|
||||
// highlightJS.registerLanguage('leaf', leaf);
|
||||
highlightJS.registerLanguage('less', less);
|
||||
highlightJS.registerLanguage('lisp', lisp);
|
||||
// highlightJS.registerLanguage('livecodeserver', livecodeserver);
|
||||
// highlightJS.registerLanguage('livescript', livescript);
|
||||
// highlightJS.registerLanguage('llvm', llvm);
|
||||
highlightJS.registerLanguage('llvm', llvm);
|
||||
// highlightJS.registerLanguage('lsl', lsl);
|
||||
highlightJS.registerLanguage('lua', lua);
|
||||
highlightJS.registerLanguage('makefile', makefile);
|
||||
// highlightJS.registerLanguage('mathematica', mathematica);
|
||||
// highlightJS.registerLanguage('matlab', matlab);
|
||||
highlightJS.registerLanguage('mathematica', mathematica);
|
||||
highlightJS.registerLanguage('matlab', matlab);
|
||||
// highlightJS.registerLanguage('maxima', maxima);
|
||||
// highlightJS.registerLanguage('mel', mel);
|
||||
// highlightJS.registerLanguage('mercury', mercury);
|
||||
|
|
@ -317,18 +312,17 @@ highlightJS.registerLanguage('perl', perl);
|
|||
// highlightJS.registerLanguage('moonscript', moonscript);
|
||||
// highlightJS.registerLanguage('n1ql', n1ql);
|
||||
highlightJS.registerLanguage('nginx', nginx);
|
||||
// highlightJS.registerLanguage('nim', nim);
|
||||
// highlightJS.registerLanguage('nix', nix);
|
||||
// highlightJS.registerLanguage('nimrod', nimrod);
|
||||
highlightJS.registerLanguage('nix', nix);
|
||||
// highlightJS.registerLanguage('nsis', nsis);
|
||||
highlightJS.registerLanguage('objectivec', objectivec);
|
||||
// highlightJS.registerLanguage('ocaml', ocaml);
|
||||
highlightJS.registerLanguage('ocaml', ocaml);
|
||||
// highlightJS.registerLanguage('openscad', openscad);
|
||||
// highlightJS.registerLanguage('oxygene', oxygene);
|
||||
// highlightJS.registerLanguage('parser3', parser3);
|
||||
// highlightJS.registerLanguage('pf', pf);
|
||||
highlightJS.registerLanguage('pgsql', pgsql);
|
||||
highlightJS.registerLanguage('php', php);
|
||||
// highlightJS.registerLanguage('php-template', phpTemplate);
|
||||
highlightJS.registerLanguage('plaintext', plaintext);
|
||||
// highlightJS.registerLanguage('pony', pony);
|
||||
highlightJS.registerLanguage('powershell', powershell);
|
||||
|
|
@ -337,14 +331,13 @@ highlightJS.registerLanguage('powershell', powershell);
|
|||
// highlightJS.registerLanguage('prolog', prolog);
|
||||
highlightJS.registerLanguage('properties', properties);
|
||||
highlightJS.registerLanguage('protobuf', protobuf);
|
||||
// highlightJS.registerLanguage('puppet', puppet);
|
||||
highlightJS.registerLanguage('puppet', puppet);
|
||||
// highlightJS.registerLanguage('purebasic', purebasic);
|
||||
highlightJS.registerLanguage('python', python);
|
||||
// highlightJS.registerLanguage('python-repl', pythonRepl);
|
||||
// highlightJS.registerLanguage('q', q);
|
||||
// highlightJS.registerLanguage('qml', qml);
|
||||
// highlightJS.registerLanguage('r', r);
|
||||
// highlightJS.registerLanguage('reasonml', reasonml);
|
||||
highlightJS.registerLanguage('r', r);
|
||||
highlightJS.registerLanguage('reasonml', reasonml);
|
||||
// highlightJS.registerLanguage('rib', rib);
|
||||
// highlightJS.registerLanguage('roboconf', roboconf);
|
||||
// highlightJS.registerLanguage('routeros', routeros);
|
||||
|
|
@ -353,7 +346,7 @@ highlightJS.registerLanguage('python', python);
|
|||
highlightJS.registerLanguage('rust', rust);
|
||||
// highlightJS.registerLanguage('sas', sas);
|
||||
highlightJS.registerLanguage('scala', scala);
|
||||
// highlightJS.registerLanguage('scheme', scheme);
|
||||
highlightJS.registerLanguage('scheme', scheme);
|
||||
// highlightJS.registerLanguage('scilab', scilab);
|
||||
highlightJS.registerLanguage('scss', scss);
|
||||
highlightJS.registerLanguage('shell', shell);
|
||||
|
|
@ -365,13 +358,14 @@ highlightJS.registerLanguage('sql', sql);
|
|||
// highlightJS.registerLanguage('stan', stan);
|
||||
// highlightJS.registerLanguage('stata', stata);
|
||||
// highlightJS.registerLanguage('step21', step21);
|
||||
// highlightJS.registerLanguage('stylus', stylus);
|
||||
highlightJS.registerLanguage('stylus', stylus);
|
||||
// highlightJS.registerLanguage('subunit', subunit);
|
||||
highlightJS.registerLanguage('swift', swift);
|
||||
// highlightJS.registerLanguage('taggerscript', taggerscript);
|
||||
highlightJS.registerLanguage('yaml', yaml);
|
||||
// highlightJS.registerLanguage('tap', tap);
|
||||
// highlightJS.registerLanguage('tcl', tcl);
|
||||
highlightJS.registerLanguage('tex', tex);
|
||||
// highlightJS.registerLanguage('thrift', thrift);
|
||||
// highlightJS.registerLanguage('tp', tp);
|
||||
// highlightJS.registerLanguage('twig', twig);
|
||||
|
|
@ -379,10 +373,10 @@ highlightJS.registerLanguage('typescript', typescript);
|
|||
// highlightJS.registerLanguage('vala', vala);
|
||||
// highlightJS.registerLanguage('vbnet', vbnet);
|
||||
// highlightJS.registerLanguage('vbscript', vbscript);
|
||||
// highlightJS.registerLanguage('vbscript-html', vbscriptHtml);
|
||||
// highlightJS.registerLanguage('vbscript-html', vbscript-html);
|
||||
// highlightJS.registerLanguage('verilog', verilog);
|
||||
// highlightJS.registerLanguage('vhdl', vhdl);
|
||||
// highlightJS.registerLanguage('vim', vim);
|
||||
highlightJS.registerLanguage('vim', vim);
|
||||
// highlightJS.registerLanguage('x86asm', x86asm);
|
||||
// highlightJS.registerLanguage('xl', xl);
|
||||
// highlightJS.registerLanguage('xquery', xquery);
|
||||
|
|
|
|||
|
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"exclude": ["node_modules"],
|
||||
"include": ["./**/*"]
|
||||
}
|
||||
|
|
@ -1,37 +1,28 @@
|
|||
{
|
||||
"include": ["src/**/*", "typings/**/*"],
|
||||
"exclude": ["node_modules", "src/__tests__/**"],
|
||||
"compilerOptions": {
|
||||
"outDir": "bundles-out",
|
||||
"module": "CommonJS",
|
||||
"moduleResolution": "Node",
|
||||
"target": "ES6",
|
||||
"lib": ["ES6", "DOM"],
|
||||
"jsx": "preserve",
|
||||
"outDir": "./_target",
|
||||
"target": "es5",
|
||||
"module": "commonjs",
|
||||
"moduleResolution": "node",
|
||||
"lib": ["es2015", "dom"],
|
||||
"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,
|
||||
"declarationMap": true,
|
||||
"sourceMap": true,
|
||||
"noEmit": false,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"isolatedModules": true,
|
||||
"incremental": false,
|
||||
"strictNullChecks": true,
|
||||
"removeComments": true,
|
||||
"preserveConstEnums": true,
|
||||
"sourceMap": true,
|
||||
"alwaysStrict": true,
|
||||
"strict": 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__/*"]
|
||||
}
|
||||
|
|
|
|||
5
typings/highlight.js/highlight.js.d.ts
vendored
Normal file
5
typings/highlight.js/highlight.js.d.ts
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
declare module 'highlight.js/lib/highlight.js' {
|
||||
import hljs from 'highlight.js';
|
||||
|
||||
export = hljs;
|
||||
}
|
||||
5
typings/highlight.js/languages.d.ts
vendored
Normal file
5
typings/highlight.js/languages.d.ts
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
declare module 'highlight.js/lib/languages/*' {
|
||||
import { HLJSStatic, IModeBase } from 'highlight.js';
|
||||
|
||||
export default function(hljs?: HLJSStatic): IModeBase;
|
||||
}
|
||||
|
|
@ -3,52 +3,17 @@ import path from 'path';
|
|||
import webpack from 'webpack';
|
||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||
import CopyPlugin from 'copy-webpack-plugin';
|
||||
import CopyWebpackPlugin from 'copy-webpack-plugin';
|
||||
|
||||
const pages = ['index', 'demo'];
|
||||
|
||||
type Plugin = ((this: webpack.Compiler, compiler: webpack.Compiler) => void) | webpack.WebpackPluginInstance;
|
||||
|
||||
function plugins(page: string): Plugin[] {
|
||||
return [
|
||||
new MiniCssExtractPlugin({
|
||||
filename: '[name].css',
|
||||
chunkFilename: '[id].css',
|
||||
}),
|
||||
new HtmlWebpackPlugin({
|
||||
hash: true,
|
||||
inject: true,
|
||||
title: `${page} page`,
|
||||
filename: `${page}.html`,
|
||||
template: `./website/templates/pages/${page}/${page}.handlebars`,
|
||||
minify: {
|
||||
html5: true,
|
||||
collapseWhitespace: true,
|
||||
caseSensitive: true,
|
||||
removeEmptyElements: false,
|
||||
removeComments: true,
|
||||
removeRedundantAttributes: true,
|
||||
useShortDoctype: true,
|
||||
removeEmptyAttributes: true,
|
||||
removeStyleLinkTypeAttributes: true,
|
||||
keepClosingSlash: true,
|
||||
minifyJS: true,
|
||||
minifyCSS: true,
|
||||
minifyURLs: true,
|
||||
},
|
||||
}),
|
||||
new CopyPlugin({
|
||||
patterns: [
|
||||
{ from: 'website/favicon.ico', to: 'favicon.ico' },
|
||||
{ from: 'website/robots.txt', to: 'robots.txt' },
|
||||
{ from: 'website/sitemap.xml', to: 'sitemap.xml' },
|
||||
],
|
||||
}),
|
||||
];
|
||||
}
|
||||
|
||||
const config: webpack.Configuration[] = pages.map(page => {
|
||||
return {
|
||||
devServer: {
|
||||
port: 3000,
|
||||
open: true,
|
||||
contentBase: path.join(__dirname, './website'),
|
||||
},
|
||||
entry: {
|
||||
[page]: `./website/templates/pages/${page}/${page}.ts`,
|
||||
},
|
||||
|
|
@ -143,7 +108,39 @@ const config: webpack.Configuration[] = pages.map(page => {
|
|||
},
|
||||
],
|
||||
},
|
||||
plugins: plugins(page),
|
||||
plugins: [
|
||||
new MiniCssExtractPlugin({
|
||||
filename: '[name].css',
|
||||
chunkFilename: '[id].css',
|
||||
}),
|
||||
new HtmlWebpackPlugin({
|
||||
hash: true,
|
||||
inject: true,
|
||||
title: `${page} page`,
|
||||
filename: `${page}.html`,
|
||||
template: `./website/templates/pages/${page}/${page}.handlebars`,
|
||||
minify: {
|
||||
html5: true,
|
||||
collapseWhitespace: true,
|
||||
caseSensitive: true,
|
||||
removeEmptyElements: false,
|
||||
removeComments: true,
|
||||
removeRedundantAttributes: true,
|
||||
useShortDoctype: true,
|
||||
removeEmptyAttributes: true,
|
||||
removeStyleLinkTypeAttributes: true,
|
||||
keepClosingSlash: true,
|
||||
minifyJS: true,
|
||||
minifyCSS: true,
|
||||
minifyURLs: true,
|
||||
},
|
||||
}),
|
||||
new CopyWebpackPlugin([
|
||||
{ from: 'website/favicon.ico', to: 'favicon.ico' },
|
||||
{ from: 'website/robots.txt', to: 'robots.txt' },
|
||||
{ from: 'website/sitemap.xml', to: 'sitemap.xml' },
|
||||
]),
|
||||
],
|
||||
};
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<div class="hero-body">
|
||||
<div class="container">
|
||||
<h1 class="title is-size-1 is-spaced">Demo<a href="#help">
|
||||
<svg fill="currentColor" height="32" class="octicon octicon-unverified" viewBox="0 0 16 16" version="1.1" width="64"
|
||||
<svg height="32" class="octicon octicon-unverified" viewBox="0 0 16 16" version="1.1" width="64"
|
||||
aria-hidden="true">
|
||||
<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">
|
||||
|
|
@ -33,7 +33,7 @@
|
|||
</div>
|
||||
|
||||
<div class="columns is-desktop is-multiline">
|
||||
<div class="column is-one-sixth-widescreen">
|
||||
<div class="column is-one-fifth-widescreen">
|
||||
<label title="Output format of the HTML, either line by line or side by side">
|
||||
<p>Output Format</p>
|
||||
<select class="options-label-value" id="diff-url-options-output-format" name="outputFormat">
|
||||
|
|
@ -42,24 +42,14 @@
|
|||
</select>
|
||||
</label>
|
||||
</div>
|
||||
<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">
|
||||
<div class="column is-one-fifth-widescreen">
|
||||
<label title="Show the file list summary before the diff">
|
||||
<p>File Summary</p>
|
||||
<input class="options-label-value" id="diff-url-options-show-files" type="checkbox" name="drawFileList"
|
||||
checked />
|
||||
</label>
|
||||
</div>
|
||||
<div class="column is-one-sixth-widescreen">
|
||||
<div class="column is-one-fifth-widescreen">
|
||||
<label title="Level of matching for the comparison algorithm">
|
||||
<p>Matching Type</p>
|
||||
<select class="options-label-value" id="diff-url-options-matching" name="matching">
|
||||
|
|
@ -69,14 +59,14 @@
|
|||
</select>
|
||||
</label>
|
||||
</div>
|
||||
<div class="column is-one-sixth-widescreen">
|
||||
<div class="column is-one-fifth-widescreen">
|
||||
<label title="Similarity threshold for the matching algorithm">
|
||||
<p>Words Threshold</p>
|
||||
<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" />
|
||||
</label>
|
||||
</div>
|
||||
<div class="column is-one-sixth-widescreen">
|
||||
<div class="column is-one-fifth-widescreen">
|
||||
<label title="Maximum number of comparison performed by the matching algorithm in a block of changes">
|
||||
<p>Max Comparisons</p>
|
||||
<input class="options-label-value" id="diff-url-options-matching-max-comparisons" type="number"
|
||||
|
|
@ -99,7 +89,7 @@
|
|||
<ul>
|
||||
<li class="block">
|
||||
<p class="has-text-weight-bold">Why should I use this instead of GitHub, Bitbucket or GitLab?</p>
|
||||
<p>There are multiple advantages to using diff2html, but they can be divided in two categories: portability and
|
||||
<p>There are multiple advantages to using diff2html, but they can be devided in two categories: portability and
|
||||
features.
|
||||
</p>
|
||||
<p>
|
||||
|
|
@ -110,7 +100,7 @@
|
|||
Regarding features you can have code syntax highlight, line similarity matching (similar lines are together),
|
||||
line by Line and side by side diffs and easy code selection.
|
||||
</p>
|
||||
<p>All of this is completely independent of the provider you use to version the code.</p>
|
||||
<p>All of this is completly independent of the provider you use to version the code.</p>
|
||||
</li>
|
||||
<li class="block">
|
||||
<p class="has-text-weight-bold">What urls are supported in this demo?</p>
|
||||
|
|
@ -122,7 +112,7 @@
|
|||
<p>Just copy the url from the page, which should contain all the customizations and reference for the diff you
|
||||
introduced.</p>
|
||||
<p>ex: <a
|
||||
href="demo.html?matching=none&matchWordsThreshold=0.25&maxLineLengthHighlight=10000&diffStyle=word&renderNothingWhenEmpty=0&matchingMaxComparisons=2500&maxLineSizeInBlockForComparison=200&outputFormat=line-by-line&drawFileList=1&synchronisedScroll=1&highlight=1&fileListToggle=1&fileListStartVisible=0&diff=https://github.com/rtfpessoa/diff2html/pull/106">https://diff2html.xyz/demo.html?matching=none&matchWordsThreshold=0.25&maxLineLengthHighlight=10000&diffStyle=word&renderNothingWhenEmpty=0&matchingMaxComparisons=2500&maxLineSizeInBlockForComparison=200&outputFormat=line-by-line&drawFileList=1&synchronisedScroll=1&highlight=1&fileListToggle=1&fileListStartVisible=0&diff=https://github.com/rtfpessoa/diff2html/pull/106</a>
|
||||
href="demo.html?matching=none&matchWordsThreshold=0.25&maxLineLengthHighlight=10000&diffStyle=word&renderNothingWhenEmpty=0&matchingMaxComparisons=2500&maxLineSizeInBlockForComparison=200&outputFormat=line-by-line&drawFileList=1&synchronisedScroll=1&highlight=1&fileListToggle=1&fileListStartVisible=0&smartSelection=1&diff=https://github.com/rtfpessoa/diff2html/pull/106">https://diff2html.xyz/demo.html?matching=none&matchWordsThreshold=0.25&maxLineLengthHighlight=10000&diffStyle=word&renderNothingWhenEmpty=0&matchingMaxComparisons=2500&maxLineSizeInBlockForComparison=200&outputFormat=line-by-line&drawFileList=1&synchronisedScroll=1&highlight=1&fileListToggle=1&fileListStartVisible=0&smartSelection=1&diff=https://github.com/rtfpessoa/diff2html/pull/106</a>
|
||||
</p>
|
||||
</li>
|
||||
<li class="block">
|
||||
|
|
@ -144,4 +134,4 @@
|
|||
providing better diff support for existing online services.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
|
@ -5,21 +5,3 @@
|
|||
.diff-url-btn.is-small {
|
||||
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,11 +2,9 @@ import { Diff2HtmlUI, defaultDiff2HtmlUIConfig, Diff2HtmlUIConfig } from '../../
|
|||
|
||||
import '../../../main.ts';
|
||||
import '../../../main.css';
|
||||
import './github-highlights.css';
|
||||
import 'highlight.js/styles/github.css';
|
||||
import '../../../../src/ui/css/diff2html.css';
|
||||
import './demo.css';
|
||||
import { colorSchemeToCss } from '../../../../src/render-utils';
|
||||
import { ColorSchemeType } from '../../../../src/types';
|
||||
|
||||
/*
|
||||
* Example URLs:
|
||||
|
|
@ -23,8 +21,7 @@ import { ColorSchemeType } from '../../../../src/types';
|
|||
|
||||
type URLParams = {
|
||||
diff?: string;
|
||||
diffTooBigMessage?: string;
|
||||
[key: string]: string | boolean | number | Map<string, string> | undefined;
|
||||
[key: string]: string | boolean | number | undefined;
|
||||
};
|
||||
|
||||
const searchParam = 'diff';
|
||||
|
|
@ -67,14 +64,11 @@ function prepareRequest(url: string): Request {
|
|||
let fetchUrl;
|
||||
const headers = new Headers();
|
||||
|
||||
const githubCommitUrl =
|
||||
/^https?:\/\/(?:www\.)?github\.com\/(.*?)\/(.*?)\/commit\/(.*?)(?:\.diff)?(?:\.patch)?(?:\/.*)?$/;
|
||||
const githubCommitUrl = /^https?:\/\/(?:www\.)?github\.com\/(.*?)\/(.*?)\/commit\/(.*?)(?:\.diff)?(?:\.patch)?(?:\/.*)?$/;
|
||||
const githubPrUrl = /^https?:\/\/(?:www\.)?github\.com\/(.*?)\/(.*?)\/pull\/(.*?)(?:\.diff)?(?:\.patch)?(?:\/.*)?$/;
|
||||
|
||||
const gitlabCommitUrl =
|
||||
/^https?:\/\/(?:www\.)?gitlab\.com\/(.*?)\/(.*?)\/commit\/(.*?)(?:\.diff)?(?:\.patch)?(?:\/.*)?$/;
|
||||
const gitlabPrUrl =
|
||||
/^https?:\/\/(?:www\.)?gitlab\.com\/(.*?)\/(.*?)\/merge_requests\/(.*?)(?:\.diff)?(?:\.patch)?(?:\/.*)?$/;
|
||||
const gitlabCommitUrl = /^https?:\/\/(?:www\.)?gitlab\.com\/(.*?)\/(.*?)\/commit\/(.*?)(?:\.diff)?(?:\.patch)?(?:\/.*)?$/;
|
||||
const gitlabPrUrl = /^https?:\/\/(?:www\.)?gitlab\.com\/(.*?)\/(.*?)\/merge_requests\/(.*?)(?:\.diff)?(?:\.patch)?(?:\/.*)?$/;
|
||||
|
||||
const bitbucketCommitUrl = /^https?:\/\/(?:www\.)?bitbucket\.org\/(.*?)\/(.*?)\/commits\/(.*?)(?:\/raw)?(?:\/.*)?$/;
|
||||
const bitbucketPrUrl = /^https?:\/\/(?:www\.)?bitbucket\.org\/(.*?)\/(.*?)\/pull-requests\/(.*?)(?:\/.*)?$/;
|
||||
|
|
@ -112,7 +106,8 @@ function prepareRequest(url: string): Request {
|
|||
} else if ((values = bitbucketPrUrl.exec(url))) {
|
||||
fetchUrl = bitbucketUrlGen(values[1], values[2], 'pullrequests', values[3]);
|
||||
} else {
|
||||
fetchUrl = url;
|
||||
console.info('Could not parse url, using the provided url.');
|
||||
fetchUrl = 'https://crossorigin.me/' + url;
|
||||
}
|
||||
|
||||
return {
|
||||
|
|
@ -122,17 +117,11 @@ function prepareRequest(url: string): Request {
|
|||
}
|
||||
|
||||
function getConfiguration(urlParams: URLParams): Diff2HtmlUIConfig {
|
||||
// Removing `diff` and `diffTooBigMessage` form `urlParams` to avoid being inserted
|
||||
const { diff, diffTooBigMessage, ...urlParamsRest } = urlParams;
|
||||
|
||||
const defaultColorScheme: ColorSchemeType =
|
||||
window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||
? ColorSchemeType.DARK
|
||||
: ColorSchemeType.LIGHT;
|
||||
|
||||
// Removing `diff` form `urlParams` to avoid being inserted
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const { diff, ...urlParamsRest } = urlParams;
|
||||
const config: URLParams = {
|
||||
...defaultDiff2HtmlUIConfig,
|
||||
colorScheme: defaultColorScheme,
|
||||
...urlParamsRest,
|
||||
};
|
||||
|
||||
|
|
@ -140,8 +129,8 @@ function getConfiguration(urlParams: URLParams): Diff2HtmlUIConfig {
|
|||
const newObject = !Number.isNaN(Number(v))
|
||||
? { [k]: Number(v) }
|
||||
: v === 'true' || v === 'false'
|
||||
? { [k]: Boolean(v) }
|
||||
: { [k]: v };
|
||||
? { [k]: Boolean(v) }
|
||||
: { [k]: v };
|
||||
return { ...object, ...newObject };
|
||||
}, {});
|
||||
}
|
||||
|
|
@ -163,16 +152,9 @@ async function getDiff(request: Request): Promise<string> {
|
|||
|
||||
function draw(diffString: string, config: Diff2HtmlUIConfig, elements: Elements): void {
|
||||
const diff2htmlUi = new Diff2HtmlUI(elements.structure.diffTarget, diffString, config);
|
||||
|
||||
setBodyColorScheme(diff2htmlUi.config.colorScheme);
|
||||
|
||||
diff2htmlUi.draw();
|
||||
}
|
||||
|
||||
function setBodyColorScheme(colorScheme: ColorSchemeType): void {
|
||||
document.body.className = colorSchemeToCss(colorScheme);
|
||||
}
|
||||
|
||||
async function prepareInitialState(elements: Elements): Promise<[Diff2HtmlUIConfig, string]> {
|
||||
const urlParams = getParamsFromSearch(window.location.search);
|
||||
const currentUrl = (urlParams && urlParams[searchParam]) || 'https://github.com/rtfpessoa/diff2html/pull/106';
|
||||
|
|
@ -188,21 +170,23 @@ async function prepareInitialState(elements: Elements): Promise<[Diff2HtmlUIConf
|
|||
}
|
||||
|
||||
function updateBrowserUrl(config: Diff2HtmlUIConfig, newDiffUrl: string): void {
|
||||
const paramString = Object.entries(config)
|
||||
.map(([k, v]) => k + '=' + v)
|
||||
.join('&');
|
||||
const newPageUrl =
|
||||
window.location.protocol +
|
||||
'//' +
|
||||
window.location.host +
|
||||
window.location.pathname +
|
||||
'?' +
|
||||
paramString +
|
||||
'&' +
|
||||
searchParam +
|
||||
'=' +
|
||||
newDiffUrl;
|
||||
window.history.pushState({ path: newPageUrl }, '', newPageUrl);
|
||||
if (history.pushState) {
|
||||
const paramString = Object.entries(config)
|
||||
.map(([k, v]) => k + '=' + v)
|
||||
.join('&');
|
||||
const newPageUrl =
|
||||
window.location.protocol +
|
||||
'//' +
|
||||
window.location.host +
|
||||
window.location.pathname +
|
||||
'?' +
|
||||
paramString +
|
||||
'&' +
|
||||
searchParam +
|
||||
'=' +
|
||||
newDiffUrl;
|
||||
window.history.pushState({ path: newPageUrl }, '', newPageUrl);
|
||||
}
|
||||
}
|
||||
|
||||
type Elements = {
|
||||
|
|
@ -215,7 +199,6 @@ type Elements = {
|
|||
};
|
||||
options: {
|
||||
outputFormat: HTMLInputElement;
|
||||
colorScheme: HTMLInputElement;
|
||||
matching: HTMLInputElement;
|
||||
wordsThreshold: HTMLInputElement;
|
||||
matchingMaxComparisons: HTMLInputElement;
|
||||
|
|
@ -251,7 +234,6 @@ function getHTMLElementById(id: string): HTMLElement {
|
|||
|
||||
document.addEventListener('DOMContentLoaded', async () => {
|
||||
// Improves browser compatibility
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||
require('whatwg-fetch');
|
||||
|
||||
const drawAndUpdateUrl = async (
|
||||
|
|
@ -276,7 +258,6 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
},
|
||||
options: {
|
||||
outputFormat: getHTMLInputElementById('diff-url-options-output-format'),
|
||||
colorScheme: getHTMLInputElementById('diff-url-options-color-scheme'),
|
||||
matching: getHTMLInputElementById('diff-url-options-matching'),
|
||||
wordsThreshold: getHTMLInputElementById('diff-url-options-match-words-threshold'),
|
||||
matchingMaxComparisons: getHTMLInputElementById('diff-url-options-matching-max-comparisons'),
|
||||
|
|
@ -289,13 +270,12 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
let [config, diffString] = await prepareInitialState(elements);
|
||||
|
||||
// Update HTML inputs from any changes in URL
|
||||
if (config.outputFormat) elements.options.outputFormat.value = config.outputFormat;
|
||||
if (config.colorScheme) elements.options.colorScheme.value = config.colorScheme;
|
||||
if (config.drawFileList) elements.checkboxes.drawFileList.checked = config.drawFileList;
|
||||
if (config.matching) elements.options.matching.value = config.matching;
|
||||
if (config.matchWordsThreshold) elements.options.wordsThreshold.value = config.matchWordsThreshold.toString();
|
||||
if (config.matchingMaxComparisons)
|
||||
elements.options.matchingMaxComparisons.value = config.matchingMaxComparisons.toString();
|
||||
config.outputFormat && (elements.options.outputFormat.value = config.outputFormat);
|
||||
config.drawFileList && (elements.checkboxes.drawFileList.checked = config.drawFileList);
|
||||
config.matching && (elements.options.matching.value = config.matching);
|
||||
config.matchWordsThreshold && (elements.options.wordsThreshold.value = config.matchWordsThreshold.toString());
|
||||
config.matchingMaxComparisons &&
|
||||
(elements.options.matchingMaxComparisons.value = config.matchingMaxComparisons.toString());
|
||||
|
||||
Object.entries(elements.options).forEach(([option, element]) =>
|
||||
element.addEventListener('change', () => {
|
||||
|
|
|
|||
|
|
@ -1,332 +0,0 @@
|
|||
/*!
|
||||
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>
|
||||
</div>
|
||||
<p>
|
||||
<a href="https://github.com/rtfpessoa/diff2html#usage" target="_blank" rel="noopener" rel="noreferrer">
|
||||
<a href="https://github.com/rtfpessoa/diff2html#how-to-use" target="_blank" rel="noopener" rel="noreferrer">
|
||||
Find usage examples in the Docs
|
||||
</a>
|
||||
</p>
|
||||
|
|
@ -85,8 +85,8 @@
|
|||
<div class="column">
|
||||
<h4 class="title is-size-4 is-spaced"><strong>With command line integration</strong></h4>
|
||||
<p>We work hard to make sure you can have your diffs in a simple and flexible
|
||||
way. Go here for the <a href="https://github.com/rtfpessoa/diff2html-cli#readme" target="_blank"
|
||||
rel="noopener" rel="noreferrer">full
|
||||
way. Go here for the <a href="https://github.com/rtfpessoa/diff2html-cli" target="_blank"
|
||||
rel="noopener" rel="noreferrer"></a>full
|
||||
documentation</a>.
|
||||
</p>
|
||||
</div>
|
||||
|
|
@ -115,46 +115,8 @@
|
|||
<hr>
|
||||
|
||||
<div id="users" class="container">
|
||||
<h4 class="title is-size-4 is-spaced"><strong>Sponsor</strong></h4>
|
||||
<h4 class="title is-size-4 is-spaced"><strong>Projects using diff2html</strong></h4>
|
||||
<div class="columns is-desktop is-multiline">
|
||||
<div class="column is-half-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<div class="flex">
|
||||
<div class="flex">
|
||||
<img src="https://huggingface.co/front/assets/huggingface_logo-noborder.svg" style="height: 30px;">
|
||||
<div>
|
||||
<div style="margin-left: 5px;" class="is-size-5 has-text-weight-bold flex">Hugging Face</div>
|
||||
</div>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>The AI community building the future. Build, train and deploy state of the art models powered by the reference open source in natural language processing.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://huggingface.co/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h4 class="title is-size-4 is-spaced"><strong>Other projects using diff2html</strong></h4>
|
||||
<div class="columns is-desktop is-multiline">
|
||||
<div class="column is-one-quarter-widescreen is-flex" style="min-height: 166px;">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">Exercism</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Get really good at programming.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://exercism.org/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
|
|
@ -169,21 +131,19 @@
|
|||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">Codacy</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Automate code reviews on your commits and pull requests.</p>
|
||||
<p>Check code style, security, duplication, complexity and coverage on every change.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://www.codacy.com" target="_blank" rel="noopener" rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
|
|
@ -198,7 +158,6 @@
|
|||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
|
|
@ -212,7 +171,6 @@
|
|||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
|
|
@ -222,12 +180,91 @@
|
|||
<p>Show diffs between builds</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://plugins.jenkins.io/last-changes/" target="_blank"
|
||||
<a href="https://wiki.jenkins-ci.org/display/JENKINS/Last+Changes+Plugin" target="_blank"
|
||||
rel="noopener" rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">jest-stare</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Jest HTML Reporter and Results Processor.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://dkelosky.github.io/jest-stare/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">kubeapps</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>A web-based UI for deploying and managing applications in Kubernetes clusters.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://kubeapps.com/" target="_blank" rel="noopener" rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">Hitchhiker</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>A a Restful Api test tool.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="http://www.hitchhiker-api.com/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">growi</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Team collaboration software using markdown.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://growi.org/" target="_blank" rel="noopener" rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">crowi</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Markdown Wiki - Empower the team with sharing your knowledge.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="http://site.crowi.wiki/" target="_blank" rel="noopener" rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">Wiki.js</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>A modern, lightweight and powerful wiki app built on Node.js.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://wiki.js.org/" target="_blank" rel="noopener" rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
|
|
@ -242,28 +279,41 @@
|
|||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">Chef Automate</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>DevOps Dashboard for Complete Operational Visibility.</p>
|
||||
<p>full suite of enterprise capabilities for maintaining continuous visibility into application,
|
||||
infrastructure, and security automation.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://automate.chef.io/" target="_blank" rel="noopener" rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">GraphQL Schema Diff</p>
|
||||
<p class="is-size-5 has-text-weight-bold">Camunda Modeler</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Detects dangerous and breaking changes in GraphQL schemas.</p>
|
||||
<p>An integrated modeling solution for BPMN, DMN and CMMN based on bpmn.io.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://camunda.com/products/modeler" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">graphql-schema-diff</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Returns the diff of two GraphQL schemas. Detects dangerous and breaking changes.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://github.com/fabsrc/graphql-schema-diff" target="_blank" rel="noopener"
|
||||
|
|
@ -271,14 +321,13 @@
|
|||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">cypress-plugin-snapshots</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Plugin for snapshot tests in Cypress.io.</p>
|
||||
<p>Plugin for snapshot tests in Cypress.io .</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://github.com/meinaart/cypress-plugin-snapshots" target="_blank" rel="noopener"
|
||||
|
|
@ -286,14 +335,13 @@
|
|||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">git-explorer</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Offline-first support for previewing local git repositories.</p>
|
||||
<p>Offline-first support for previewing and comparing branches in a local git repository.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://github.com/thescientist13/git-explorer" target="_blank" rel="noopener"
|
||||
|
|
@ -301,7 +349,34 @@
|
|||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">diff-pane</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Atom - Diff two panes.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://github.com/t-ari/diff-pane" target="_blank" rel="noopener"
|
||||
rel="noreferrer">View GitHub</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">node-giff</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Display git diff on browser.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://github.com/do7be/node-giff" target="_blank" rel="noopener"
|
||||
rel="noreferrer">View GitHub</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
|
|
@ -316,7 +391,20 @@
|
|||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">node-git</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Execute Git Command by Node.js.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://github.com/liangshuai/node-git" target="_blank" rel="noopener"
|
||||
rel="noreferrer">View GitHub</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
|
|
@ -331,171 +419,6 @@
|
|||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">jsreport</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>javascript based business reporting platform</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://jsreport.net" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">dendron</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Knowledge Management. Redefined.</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://www.dendron.so" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">jest-stare</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Jest HTML Reporter and Results Processor</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://dkelosky.github.io/jest-stare/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">Wiki.js</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>The most powerful and extensible open source Wiki software</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://js.wiki/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">Salto</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Understand Your Business Apps' Configuration</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://www.salto.io/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">intuit Design Systems CLI</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>A CLI toolbox for creating design systems</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://intuit.github.io/design-systems-cli/#/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">Camunda Modeler</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Automate processes and decisions in a modern, standards-based way</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://camunda.com/download/modeler/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">igit</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Tool for managing pull requests</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://igit.dev/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">Crowi</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Empower the team with sharing your knowledge</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://site.crowi.wiki/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">Robusta</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Open source Kubernetes troubleshooting and automation platform</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://docs.robusta.dev/master/" target="_blank" rel="noopener"
|
||||
rel="noreferrer">Website</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-one-quarter-widescreen is-flex">
|
||||
<div class="box is-flex is-fullwidth is-vertical">
|
||||
<header>
|
||||
<p class="is-size-5 has-text-weight-bold">git-tabular-diff</p>
|
||||
</header>
|
||||
<section class="media-content">
|
||||
<p>Displays a tabular difference of a csv file or a split difference of any file in an Atom pane</p>
|
||||
</section>
|
||||
<footer>
|
||||
<a href="https://github.com/jstritch/git-tabular-diff" target="_blank" rel="noopener"
|
||||
rel="noreferrer">View GitHub</a>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -510,9 +433,9 @@
|
|||
<a href="https://gitter.im/rtfpessoa/diff2html" target="_blank" rel="noopener" rel="noreferrer">Gitter</a>.
|
||||
Need any help?
|
||||
</p>
|
||||
<a href="https://github.com/rtfpessoa/diff2html#usage" target="_blank" rel="noopener" rel="noreferrer">
|
||||
<a href="https://github.com/rtfpessoa/diff2html#how-to-use" target="_blank" rel="noopener" rel="noreferrer">
|
||||
Read more in the Docs
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</section>
|
||||
|
|
@ -8,11 +8,7 @@
|
|||
}
|
||||
|
||||
.hero-booticon {
|
||||
font-family:
|
||||
Helvetica Neue,
|
||||
Helvetica,
|
||||
Arial,
|
||||
sans-serif;
|
||||
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
|
||||
margin: 0 auto 30px;
|
||||
width: 100%;
|
||||
font-size: 8vw;
|
||||
|
|
@ -46,12 +42,6 @@
|
|||
cursor: pointer;
|
||||
}
|
||||
|
||||
.flex {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.is-fullwidth {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
|
@ -59,7 +49,3 @@
|
|||
.is-vertical {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.align-middle {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,4 +4,5 @@ import '../../../main.ts';
|
|||
import '../../../main.css';
|
||||
import './index.css';
|
||||
|
||||
// eslint-disable-next-line no-new
|
||||
new Clipboard(document.getElementsByClassName('clipboard')[0]);
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@
|
|||
<a href="https://twitter.com/rtfpessoa" target="_blank" rel="noopener" rel="noreferrer">@rtfpessoa</a>.
|
||||
</p>
|
||||
<p>
|
||||
<a class="footer-list-link" href="https://github.com/rtfpessoa/diff2html#usage" target="_blank"
|
||||
<a class="footer-list-link" href="https://github.com/rtfpessoa/diff2html#how-to-use" target="_blank"
|
||||
rel="noopener" rel="noreferrer">FAQ</a>
|
||||
-
|
||||
<a class="footer-list-link" href="https://diff2html.xyz">diff2html</a>
|
||||
|
|
@ -102,4 +102,4 @@
|
|||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
Loading…
Reference in a new issue