Compare commits
299 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1350740c98 | ||
|
|
04640cccbe | ||
|
|
babcdb0405 | ||
|
|
2f4f41a31d | ||
|
|
2f8c477f66 | ||
|
|
064659a70e | ||
|
|
eef651f0d4 | ||
|
|
d67d80eb41 | ||
|
|
a88e4b3ba4 | ||
|
|
dbdd2e9c26 | ||
|
|
05fbd33a3a | ||
|
|
b2e31b6083 | ||
|
|
00a12d11aa | ||
|
|
b517e40e5c | ||
|
|
dea1d300b3 | ||
|
|
4de87bf099 | ||
|
|
aa4731953e | ||
|
|
363b619d87 | ||
|
|
7005ced0b5 | ||
|
|
99b7757a3a | ||
|
|
dd4b774958 | ||
|
|
b04a400329 | ||
|
|
7410d25ee4 | ||
|
|
987d8cb65c | ||
|
|
d425892b61 | ||
|
|
f7aacc4fc0 | ||
|
|
0de1e040b0 | ||
|
|
4b42e4b0de | ||
|
|
863246eed0 | ||
|
|
3865a5f27e | ||
|
|
b26353c04d | ||
|
|
8d9a8a8265 | ||
|
|
1aa822da56 | ||
|
|
786e5cc027 | ||
|
|
9806d677f3 | ||
|
|
efd28ffb3a | ||
|
|
93103e2c49 | ||
|
|
0029890ead | ||
|
|
79268800ff | ||
|
|
9f8d6bd4ca | ||
|
|
669ee2bff8 | ||
|
|
0dccfa26a5 | ||
|
|
c244b0dd51 | ||
|
|
4e6bb49788 | ||
|
|
14989f1ddd | ||
|
|
58c088977e | ||
|
|
c22febdbd6 | ||
|
|
1b0c1a87a2 | ||
|
|
84a323f0de | ||
|
|
0b76161d86 | ||
|
|
6ed6a5da88 | ||
|
|
47000723a9 | ||
|
|
6b420de752 | ||
|
|
bd4a84cd3e | ||
|
|
1aafcb201b | ||
|
|
4d2505dac8 | ||
|
|
ff3a86d393 | ||
|
|
5dae945e95 | ||
|
|
8102d3cf61 | ||
|
|
2ffca85422 | ||
|
|
299f7800c3 | ||
|
|
66912a3a54 | ||
|
|
3732d59249 | ||
|
|
412928fc59 | ||
|
|
61695e2896 | ||
|
|
93d0fbc6c3 | ||
|
|
61d90c1c41 | ||
|
|
f6f05db2f6 | ||
|
|
41a901694d | ||
|
|
3516684c68 | ||
|
|
638a4a286f | ||
|
|
9d805bb021 | ||
|
|
8d34de633a | ||
|
|
409b5e2f6b | ||
|
|
657d48aac0 | ||
|
|
611957e270 | ||
|
|
dfe2eec8df | ||
|
|
40a9c0bdc8 | ||
|
|
a2d34e195c | ||
|
|
e46184baa2 | ||
|
|
7a3a4398d1 | ||
|
|
2c7e03d266 | ||
|
|
c76b24a1fd | ||
|
|
68515376a1 | ||
|
|
551a0b407f | ||
|
|
32239a0b9d | ||
|
|
0d314aecd1 | ||
|
|
09cbe87595 | ||
|
|
a716739a18 | ||
|
|
24ccfefa26 | ||
|
|
ca2397830c | ||
|
|
66c305b854 | ||
|
|
be09a43715 | ||
|
|
d2e3705575 | ||
|
|
d0ead3a14c | ||
|
|
9247496115 | ||
|
|
432901db33 | ||
|
|
838bdf6095 | ||
|
|
7d173d5f4c | ||
|
|
897447d7d7 | ||
|
|
37caf65775 | ||
|
|
be4b1d0624 | ||
|
|
1cc02ff4e1 | ||
|
|
7e37ce307a | ||
|
|
81b0f67107 | ||
|
|
51cd7854f9 | ||
|
|
88b06ef3e3 | ||
|
|
c89192a37f | ||
|
|
df005c3f06 | ||
|
|
7cd6bb9aff | ||
|
|
1167be6add | ||
|
|
7b6ee267af | ||
|
|
3a480e4ab0 | ||
|
|
6db4aae9e5 | ||
|
|
4dae65d5c7 | ||
|
|
35008fba4b | ||
|
|
5ca9d22276 | ||
|
|
7d4a5dce6f | ||
|
|
59ff2956ab | ||
|
|
1a7612c0ff | ||
|
|
86f43ba5ae | ||
|
|
f9d328e9b8 | ||
|
|
35e518fe4f | ||
|
|
5373ae180b | ||
|
|
95e4c40a30 | ||
|
|
a09d50a94f | ||
|
|
26adbdb220 | ||
|
|
a3a0385991 | ||
|
|
a5e2fab2f1 | ||
|
|
0ed9e76a35 | ||
|
|
82a2da0033 | ||
|
|
b164b511d8 | ||
|
|
31a418601b | ||
|
|
93a53cdb4e | ||
|
|
1c59463034 | ||
|
|
41037b20f3 | ||
|
|
e5c813949f | ||
|
|
4b9114afe5 | ||
|
|
7e3c867d74 | ||
|
|
57ff821635 | ||
|
|
50806ba4e7 | ||
|
|
1275853d62 | ||
|
|
95006629ec | ||
|
|
e08596da35 | ||
|
|
1f61965110 | ||
|
|
4067ecdb92 | ||
|
|
e1f641748a | ||
|
|
f5e1437f34 | ||
|
|
c541b98e14 | ||
|
|
bc6ca55e8d | ||
|
|
2466a74fec | ||
|
|
973842064c | ||
|
|
05c2915e59 | ||
|
|
b0c5a70216 | ||
|
|
2f832aa610 | ||
|
|
6b2b9de2c2 | ||
|
|
1d5c2b67f2 | ||
|
|
68395e5562 | ||
|
|
d7fbb14ac6 | ||
|
|
206919b836 | ||
|
|
a77a8def37 | ||
|
|
ac47539d09 | ||
|
|
295d1fe156 | ||
|
|
182250152f | ||
|
|
1b4420cadd | ||
|
|
b141f14762 | ||
|
|
ad2314549a | ||
|
|
c04489d624 | ||
|
|
db07f271d6 | ||
|
|
60b7eb80f5 | ||
|
|
31318145e7 | ||
|
|
7a042fdd6b | ||
|
|
abb9064e11 | ||
|
|
bba6114a86 | ||
|
|
c8901b5796 | ||
|
|
45e6f9f266 | ||
|
|
b49cad2290 | ||
|
|
561a7f9efa | ||
|
|
d3859b8088 | ||
|
|
c6ccf02623 | ||
|
|
7ef1a6f9a5 | ||
|
|
f8ea8a73b7 | ||
|
|
d262ff2176 | ||
|
|
a9707cd9c3 | ||
|
|
1e0921c621 | ||
|
|
72b0610d2c | ||
|
|
dbb27ed3b0 | ||
|
|
679e67b555 | ||
|
|
f788039ba0 | ||
|
|
69987a8a7f | ||
|
|
6ce9292c52 | ||
|
|
e44b4b1363 | ||
|
|
cfe56add8f | ||
|
|
7253dbb900 | ||
|
|
5f4b45c4b9 | ||
|
|
73f7d4304b | ||
|
|
04b598599a | ||
|
|
6572b68bf2 | ||
|
|
b8594e1994 | ||
|
|
6ad7f00be2 | ||
|
|
9987e7c695 | ||
|
|
239d943fad | ||
|
|
6567ad423d | ||
|
|
73ab5ba050 | ||
|
|
be5d5ee1c7 | ||
|
|
110b90bc75 | ||
|
|
79d061f431 | ||
|
|
1882e58796 | ||
|
|
ac9e2ce706 | ||
|
|
8735dfccb6 | ||
|
|
ea14e3d5ef | ||
|
|
4f5db83d30 | ||
|
|
97b245883c | ||
|
|
8c6ed5aa14 | ||
|
|
78b9cb69ae | ||
|
|
9ed73c7a66 | ||
|
|
defff26b9a | ||
|
|
0475545a01 | ||
|
|
fb66c8f983 | ||
|
|
006d82c02b | ||
|
|
8fc491c499 | ||
|
|
794bdb2e1c | ||
|
|
642b000ad4 | ||
|
|
ba257b53dc | ||
|
|
084eb408dd | ||
|
|
bf7b52ad30 | ||
|
|
a4e619efa4 | ||
|
|
51d19ebc2e | ||
|
|
32b7cfc5d1 | ||
|
|
38a9d8f93e | ||
|
|
e55d145036 | ||
|
|
7668889493 | ||
|
|
a65a3b9562 | ||
|
|
08f14e2db1 | ||
|
|
f220ca11e4 | ||
|
|
b057c6f308 | ||
|
|
9aa2ea924e | ||
|
|
5915ecdaa1 | ||
|
|
ea9c1fee48 | ||
|
|
f046d183df | ||
|
|
9e831469a5 | ||
|
|
c3d7df3bc5 | ||
|
|
242fc5ae7b | ||
|
|
49bf898e0e | ||
|
|
8ee76bf44b | ||
|
|
316803df77 | ||
|
|
c178c2e91e | ||
|
|
cc9d262086 | ||
|
|
e56b2b0980 | ||
|
|
73c87c1972 | ||
|
|
640935927e | ||
|
|
59474646cb | ||
|
|
1f261e6bbf | ||
|
|
33076dc13e | ||
|
|
2d4c293a27 | ||
|
|
e48259d990 | ||
|
|
98db156d30 | ||
|
|
908272a00f | ||
|
|
275d09972f | ||
|
|
27bfd3c987 | ||
|
|
739751a021 | ||
|
|
426d9ed2a5 | ||
|
|
ed506ef091 | ||
|
|
235dbb153f | ||
|
|
4162188f80 | ||
|
|
a61c7cfd43 | ||
|
|
c7c56bca03 | ||
|
|
d410c1ac22 | ||
|
|
8462e52b30 | ||
|
|
406be9f02a | ||
|
|
12bf3068bd | ||
|
|
d2a143ef30 | ||
|
|
964387c5b0 | ||
|
|
d7d08f0c36 | ||
|
|
1844fed147 | ||
|
|
ae91dcedd0 | ||
|
|
c37321b6fa | ||
|
|
10687999f3 | ||
|
|
c3a037bc65 | ||
|
|
ee43076fca | ||
|
|
fd78929a3f | ||
|
|
5918662d06 | ||
|
|
7a57dc9667 | ||
|
|
ea5129b888 | ||
|
|
3d5ebc7509 | ||
|
|
953a5d64bf | ||
|
|
fb778f9fa9 | ||
|
|
45632dd0e4 | ||
|
|
559cdb420b | ||
|
|
76fb5227af | ||
|
|
884b95be07 | ||
|
|
05c774139a | ||
|
|
90d37608c8 | ||
|
|
7be6ef0f4d | ||
|
|
4a3ed66135 | ||
|
|
0cc9550fbf | ||
|
|
bdd88f4b90 | ||
|
|
ee58e2d700 | ||
|
|
4e28c5c327 |
61 changed files with 23724 additions and 13242 deletions
|
|
@ -52,7 +52,8 @@
|
||||||
"avatar_url": "https://avatars0.githubusercontent.com/u/8504000?v=4",
|
"avatar_url": "https://avatars0.githubusercontent.com/u/8504000?v=4",
|
||||||
"profile": "http://heyitsmattwade.com",
|
"profile": "http://heyitsmattwade.com",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"bug"
|
"bug",
|
||||||
|
"code"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -79,7 +80,8 @@
|
||||||
"avatar_url": "https://avatars0.githubusercontent.com/u/1567423?v=4",
|
"avatar_url": "https://avatars0.githubusercontent.com/u/1567423?v=4",
|
||||||
"profile": "https://saino.me/",
|
"profile": "https://saino.me/",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"bug"
|
"bug",
|
||||||
|
"code"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -97,7 +99,8 @@
|
||||||
"avatar_url": "https://avatars2.githubusercontent.com/u/7767299?v=4",
|
"avatar_url": "https://avatars2.githubusercontent.com/u/7767299?v=4",
|
||||||
"profile": "http://wesssel.github.io/",
|
"profile": "http://wesssel.github.io/",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"security"
|
"security",
|
||||||
|
"code"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -115,7 +118,8 @@
|
||||||
"avatar_url": "https://avatars1.githubusercontent.com/u/1446970?v=4",
|
"avatar_url": "https://avatars1.githubusercontent.com/u/1446970?v=4",
|
||||||
"profile": "https://github.com/sss0791",
|
"profile": "https://github.com/sss0791",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"bug"
|
"bug",
|
||||||
|
"code"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -124,7 +128,8 @@
|
||||||
"avatar_url": "https://avatars3.githubusercontent.com/u/4741620?v=4",
|
"avatar_url": "https://avatars3.githubusercontent.com/u/4741620?v=4",
|
||||||
"profile": "http://researcher.watson.ibm.com/researcher/view.php?person=us-nickm",
|
"profile": "http://researcher.watson.ibm.com/researcher/view.php?person=us-nickm",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"bug"
|
"bug",
|
||||||
|
"code"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -142,7 +147,8 @@
|
||||||
"avatar_url": "https://avatars3.githubusercontent.com/u/8926560?v=4",
|
"avatar_url": "https://avatars3.githubusercontent.com/u/8926560?v=4",
|
||||||
"profile": "https://twitter.com/pubkeypubkey",
|
"profile": "https://twitter.com/pubkeypubkey",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"doc"
|
"doc",
|
||||||
|
"code"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -160,7 +166,9 @@
|
||||||
"avatar_url": "https://avatars0.githubusercontent.com/u/1823771?v=4",
|
"avatar_url": "https://avatars0.githubusercontent.com/u/1823771?v=4",
|
||||||
"profile": "https://akr.am",
|
"profile": "https://akr.am",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"bug"
|
"bug",
|
||||||
|
"doc",
|
||||||
|
"code"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -178,7 +186,8 @@
|
||||||
"avatar_url": "https://avatars0.githubusercontent.com/u/8316?v=4",
|
"avatar_url": "https://avatars0.githubusercontent.com/u/8316?v=4",
|
||||||
"profile": "http://twitter.com/dimasabanin",
|
"profile": "http://twitter.com/dimasabanin",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"maintenance"
|
"maintenance",
|
||||||
|
"code"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -196,7 +205,8 @@
|
||||||
"avatar_url": "https://avatars1.githubusercontent.com/u/2196373?v=4",
|
"avatar_url": "https://avatars1.githubusercontent.com/u/2196373?v=4",
|
||||||
"profile": "http://webminer.js.org",
|
"profile": "http://webminer.js.org",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"bug"
|
"bug",
|
||||||
|
"doc"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -223,7 +233,6 @@
|
||||||
"avatar_url": "https://avatars0.githubusercontent.com/u/1155220?v=4",
|
"avatar_url": "https://avatars0.githubusercontent.com/u/1155220?v=4",
|
||||||
"profile": "https://github.com/escitalopram",
|
"profile": "https://github.com/escitalopram",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"bug",
|
|
||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -245,6 +254,88 @@
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"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
|
"contributorsPerLine": 7
|
||||||
|
|
|
||||||
|
|
@ -1,214 +0,0 @@
|
||||||
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
58
.eslintrc.js
|
|
@ -1,58 +0,0 @@
|
||||||
module.exports = {
|
|
||||||
parser: '@typescript-eslint/parser',
|
|
||||||
parserOptions: {
|
|
||||||
ecmaVersion: 2018,
|
|
||||||
sourceType: 'module',
|
|
||||||
},
|
|
||||||
env: {
|
|
||||||
browser: true,
|
|
||||||
es6: true,
|
|
||||||
node: true,
|
|
||||||
},
|
|
||||||
globals: {
|
|
||||||
Atomics: 'readonly',
|
|
||||||
SharedArrayBuffer: 'readonly',
|
|
||||||
document: 'readonly',
|
|
||||||
navigator: 'readonly',
|
|
||||||
window: 'readonly',
|
|
||||||
},
|
|
||||||
extends: [
|
|
||||||
'eslint:recommended',
|
|
||||||
'plugin:@typescript-eslint/eslint-recommended',
|
|
||||||
'plugin:@typescript-eslint/recommended',
|
|
||||||
'plugin:json/recommended',
|
|
||||||
'plugin:promise/recommended',
|
|
||||||
'plugin:import/errors',
|
|
||||||
'plugin:import/warnings',
|
|
||||||
'plugin:import/typescript',
|
|
||||||
'plugin:node/recommended',
|
|
||||||
'plugin:sonarjs/recommended',
|
|
||||||
'plugin:jest/recommended',
|
|
||||||
'plugin:jest/style',
|
|
||||||
'prettier',
|
|
||||||
'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
Normal file
12
.github/workflows/ci.yml
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
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
Normal file
35
.github/workflows/release.yml
vendored
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
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
Normal file
148
.github/workflows/test-and-publish.yml
vendored
Normal file
|
|
@ -0,0 +1,148 @@
|
||||||
|
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,9 +29,18 @@ bower_components/
|
||||||
# Terraform
|
# Terraform
|
||||||
/terraform/.terraform
|
/terraform/.terraform
|
||||||
|
|
||||||
/_target/
|
# Compiled templates
|
||||||
/src/diff2html-templates.*
|
/src/diff2html-templates.*
|
||||||
|
|
||||||
|
# Compiled website
|
||||||
/docs/
|
/docs/
|
||||||
|
|
||||||
|
# Bundles temporary typescript files compiled by webpack
|
||||||
|
/bundles-out/
|
||||||
|
|
||||||
|
# Web bundles
|
||||||
/bundles/
|
/bundles/
|
||||||
|
# CommonJS library
|
||||||
/lib/
|
/lib/
|
||||||
|
# ESNext library
|
||||||
/lib-esm/
|
/lib-esm/
|
||||||
|
|
|
||||||
1
.husky/.gitignore
vendored
Normal file
1
.husky/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
_
|
||||||
3
.husky/pre-commit
Executable file
3
.husky/pre-commit
Executable file
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
npm run lint:staged
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
"bracketSpacing": true,
|
"bracketSpacing": true,
|
||||||
"htmlWhitespaceSensitivity": "css",
|
"htmlWhitespaceSensitivity": "css",
|
||||||
"insertPragma": false,
|
"insertPragma": false,
|
||||||
"jsxBracketSameLine": false,
|
|
||||||
"jsxSingleQuote": false,
|
"jsxSingleQuote": false,
|
||||||
"printWidth": 120,
|
"printWidth": 120,
|
||||||
"proseWrap": "always",
|
"proseWrap": "always",
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,9 @@
|
||||||
|
|
||||||
- Before sending a pull request make sure your code is tested.
|
- Before sending a pull request make sure your code is tested.
|
||||||
|
|
||||||
- Before sending a pull request for a feature, be sure to run tests with `yarn test`.
|
- Before sending a pull request for a feature, be sure to run tests with `npm run test`.
|
||||||
|
|
||||||
- Use the same coding style as the rest of the codebase, most of the check can be performed with `yarn run lint`.
|
- Use the same coding style as the rest of the codebase, most of the check can be performed with `npm run run lint`.
|
||||||
|
|
||||||
- Use `git rebase` (not `git merge`) to sync your work from time to time with the master branch.
|
- Use `git rebase` (not `git merge`) to sync your work from time to time with the master branch.
|
||||||
|
|
||||||
|
|
|
||||||
635
README.md
635
README.md
|
|
@ -1,23 +1,20 @@
|
||||||
# diff2html
|
# diff2html
|
||||||
|
|
||||||
[](https://www.codacy.com/app/rtfpessoa/diff2html?utm_source=github.com&utm_medium=referral&utm_content=rtfpessoa/diff2html&utm_campaign=Badge_Grade)
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
[](https://www.codacy.com/app/rtfpessoa/diff2html?utm_source=github.com&utm_medium=referral&utm_content=rtfpessoa/diff2html&utm_campaign=Badge_Coverage)
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
[](https://circleci.com/gh/rtfpessoa/diff2html)
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
|
[](https://github.com/rtfpessoa/diff2html/actions/workflows/release.yml)
|
||||||
|
|
||||||
[](https://www.npmjs.com/package/diff2html)
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
[](https://david-dm.org/rtfpessoa/diff2html)
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
[](https://david-dm.org/rtfpessoa/diff2html#info=devDependencies)
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
[](https://cdnjs.com/libraries/diff2html)
|
[](https://www.npmjs.com/package/diff2html)
|
||||||
|
|
||||||
[]() []()
|
[](https://www.jsdelivr.com/package/npm/diff2html)
|
||||||
[](https://www.npmjs.com/package/diff2html)
|
[](#contributors)
|
||||||
[](#contributors)
|
|
||||||
[](https://gitter.im/rtfpessoa/diff2html?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
|
||||||
|
|
||||||
diff2html generates pretty HTML diffs from git diff or unified diff output.
|
diff2html generates pretty HTML diffs from git diff or unified diff output.
|
||||||
|
|
||||||
[](https://nodei.co/npm/diff2html/)
|
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
|
|
||||||
<!-- toc -->
|
<!-- toc -->
|
||||||
|
|
@ -26,16 +23,18 @@ diff2html generates pretty HTML diffs from git diff or unified diff output.
|
||||||
- [Online Example](#online-example)
|
- [Online Example](#online-example)
|
||||||
- [Distributions](#distributions)
|
- [Distributions](#distributions)
|
||||||
- [Usage](#usage)
|
- [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 Usage](#diff2html-usage)
|
||||||
- [Diff2Html API](#diff2html-api)
|
- [Diff2Html API](#diff2html-api)
|
||||||
- [Diff2Html Configuration](#diff2html-configuration)
|
- [Diff2Html Configuration](#diff2html-configuration)
|
||||||
- [Diff2Html Browser](#diff2html-browser)
|
- [Diff2Html Browser](#diff2html-browser)
|
||||||
- [Diff2Html NPM / Node.js Library](#diff2html-npm--nodejs-library)
|
- [Diff2Html NPM / Node.js Library](#diff2html-npm--nodejs-library)
|
||||||
- [Diff2Html Examples](#diff2html-examples)
|
- [Diff2Html Examples](#diff2html-examples)
|
||||||
- [Diff2HtmlUI Usage](#diff2htmlui-usage)
|
|
||||||
- [Diff2HtmlUI API](#diff2htmlui-api)
|
|
||||||
- [Diff2HtmlUI Configuration](#diff2htmlui-configuration)
|
|
||||||
- [Diff2HtmlUI Browser](#diff2htmlui-browser)
|
|
||||||
- [Troubleshooting](#troubleshooting)
|
- [Troubleshooting](#troubleshooting)
|
||||||
- [1. Out of memory or Slow execution](#1-out-of-memory-or-slow-execution)
|
- [1. Out of memory or Slow execution](#1-out-of-memory-or-slow-execution)
|
||||||
- [Contribute](#contribute)
|
- [Contribute](#contribute)
|
||||||
|
|
@ -65,218 +64,64 @@ diff2html generates pretty HTML diffs from git diff or unified diff output.
|
||||||
|
|
||||||
## Online Example
|
## Online Example
|
||||||
|
|
||||||
> Go to [diff2html](https://diff2html.xyz/)
|
> Go to [diff2html](https://diff2html.xyz/demo.html)
|
||||||
|
|
||||||
## Distributions
|
## Distributions
|
||||||
|
|
||||||
|
- [jsdelivr CDN](https://www.jsdelivr.com/package/npm/diff2html)
|
||||||
- [WebJar](http://www.webjars.org/)
|
- [WebJar](http://www.webjars.org/)
|
||||||
- [Node Library](https://www.npmjs.org/package/diff2html)
|
- [Node Library](https://www.npmjs.org/package/diff2html)
|
||||||
- [NPM CLI](https://www.npmjs.org/package/diff2html-cli)
|
- [NPM CLI](https://www.npmjs.org/package/diff2html-cli)
|
||||||
- Manually download and import:
|
- Manually use from jsdelivr or build the project:
|
||||||
- Browser / Bundle
|
- Browser / Bundle
|
||||||
- Parser and HTML Generator
|
- Parser and HTML Generator
|
||||||
- [bundles/js/diff2html.min.js](./bundles/js/diff2html.min.js) - includes the diff 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
|
||||||
- Wrapper and helper adding syntax highlight, synchronized scroll, and other nice features
|
- Wrapper and helper adding syntax highlight, synchronized scroll, and other nice features
|
||||||
- [bundles/js/diff2html-ui.min.js](./bundles/js/diff2html-ui.min.js) - includes the wrapper of diff2html with
|
- [bundles/js/diff2html-ui.min.js](https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js) -
|
||||||
highlight for all `highlight.js` supported languages
|
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
|
- [bundles/js/diff2html-ui-slim.min.js](https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui-slim.min.js) -
|
||||||
with "the most common" `highlight.js` supported languages
|
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
|
- [bundles/js/diff2html-ui-base.min.js](https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui-base.min.js) -
|
||||||
without including a `highlight.js` implementation. You can use it without syntax highlight or by passing your
|
includes the wrapper of diff2html without including a `highlight.js` implementation. You can use it without
|
||||||
own implementation with the languages you prefer
|
syntax highlight or by passing your own implementation with the languages you prefer
|
||||||
- NPM / Node.js library
|
- NPM / Node.js library
|
||||||
- ES5
|
- ES5
|
||||||
- [lib/diff2html.js](./lib/diff2html.js) - includes the diff parser and html generator
|
- [lib/diff2html.js](https://cdn.jsdelivr.net/npm/diff2html/lib/diff2html.js) - includes the diff parser and html
|
||||||
- [lib/ui/js/diff2html-ui.js](./lib/ui/js/diff2html-ui.js) - includes the wrapper of diff2html with highlight for
|
generator
|
||||||
all `highlight.js` supported languages
|
- [lib/ui/js/diff2html-ui.js](https://cdn.jsdelivr.net/npm/diff2html/lib/ui/js/diff2html-ui.js) - includes the
|
||||||
- [lib/ui/js/diff2html-ui-slim.js](./lib/ui/js/diff2html-ui-slim.js) - includes the wrapper of diff2html with "the
|
wrapper of diff2html with highlight for all `highlight.js` supported languages
|
||||||
most common" `highlight.js` supported languages
|
- [lib/ui/js/diff2html-ui-slim.js](https://cdn.jsdelivr.net/npm/diff2html/lib/ui/js/diff2html-ui-slim.js) -
|
||||||
- [lib/ui/js/diff2html-ui-base.js](./lib/ui/js/diff2html-ui-base.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)
|
||||||
- ES6
|
- ES6
|
||||||
- [lib-esm/diff2html.js](./lib-esm/diff2html.js) - includes the diff parser and html generator
|
- [lib-esm/diff2html.js](https://cdn.jsdelivr.net/npm/diff2html/lib-esm/diff2html.js) - includes the diff parser
|
||||||
- [lib/ui/js/diff2html-ui.js](./lib/ui/js/diff2html-ui.js) - includes the wrapper of diff2html with highlight for
|
and html generator
|
||||||
all `highlight.js` supported languages
|
- [lib/ui/js/diff2html-ui.js](https://cdn.jsdelivr.net/npm/diff2html/lib/ui/js/diff2html-ui.js) - includes the
|
||||||
- [lib/ui/js/diff2html-ui-slim.js](./lib/ui/js/diff2html-ui-slim.js) - includes the wrapper of diff2html with "the
|
wrapper of diff2html with highlight for all `highlight.js` supported languages
|
||||||
most common" `highlight.js` supported languages
|
- [lib/ui/js/diff2html-ui-slim.js](https://cdn.jsdelivr.net/npm/diff2html/lib/ui/js/diff2html-ui-slim.js) -
|
||||||
- [lib/ui/js/diff2html-ui-base.js](./lib/ui/js/diff2html-ui-base.js) - includes the wrapper of diff2html without
|
includes the wrapper of diff2html with "the most common" `highlight.js` supported languages
|
||||||
including a `highlight.js` implementation. You can use it without syntax highlight or by passing your own
|
- [lib/ui/js/diff2html-ui-base.js](https://cdn.jsdelivr.net/npm/diff2html/lib/ui/js/diff2html-ui-base.js) -
|
||||||
implementation with the languages you prefer
|
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
|
## Usage
|
||||||
|
|
||||||
Diff2Html can be used in various ways as listed in the [distributions](#distributions) section. The two main ways are:
|
Diff2Html can be used in various ways as listed in the [distributions](#distributions) section. The two main ways are:
|
||||||
|
|
||||||
- [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
|
- [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.
|
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.
|
||||||
|
|
||||||
Bellow you can find more details and exemples about each option.
|
Below you can find more details and examples about each option.
|
||||||
|
|
||||||
## Diff2Html Usage
|
## Diff Text Input
|
||||||
|
|
||||||
To load correctly in the Browser you always need to include the stylesheet in the final HTML.
|
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
|
||||||
Import the stylesheet
|
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).
|
||||||
```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
|
## Diff2HtmlUI Usage
|
||||||
|
|
||||||
|
|
@ -308,21 +153,18 @@ draw(): void
|
||||||
synchronisedScroll(): void
|
synchronisedScroll(): void
|
||||||
fileListToggle(startVisible: boolean): void
|
fileListToggle(startVisible: boolean): void
|
||||||
highlightCode(): void
|
highlightCode(): void
|
||||||
smartSelection(): void
|
stickyFileHeaders(): void
|
||||||
```
|
```
|
||||||
|
|
||||||
> Check out the [docs/demo.html](./docs/demo.html) for a demo example.
|
|
||||||
|
|
||||||
### Diff2HtmlUI Configuration
|
### Diff2HtmlUI Configuration
|
||||||
|
|
||||||
- `synchronisedScroll`: scroll both panes in side-by-side mode: `true` or `false`, default is `true`
|
- `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`
|
- `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`
|
- `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`
|
- `fileListStartVisible`: choose if the file summary list starts visible: `true` or `false`, default is `false`
|
||||||
- `smartSelection`: allow selection of the code without including line numbers of line prefixes: `true` or `false`,
|
- `fileContentToggle`: allow each file contents to be toggled: `true` or `false`, default is `true`
|
||||||
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
|
||||||
> NOTE: All the options from Diff2Html are also valid configurations in Diff2HtmlUI
|
|
||||||
|
|
||||||
### Diff2HtmlUI Browser
|
### Diff2HtmlUI Browser
|
||||||
|
|
||||||
|
|
@ -330,10 +172,10 @@ smartSelection(): void
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!-- CSS -->
|
<!-- CSS -->
|
||||||
<link rel="stylesheet" type="text/css" href="bundles/css/diff2html.min.css" />
|
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css" />
|
||||||
|
|
||||||
<!-- Javascripts -->
|
<!-- Javascripts -->
|
||||||
<script type="text/javascript" src="bundles/js/diff2html-ui.min.js"></script>
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js"></script>
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Init
|
#### Init
|
||||||
|
|
@ -355,13 +197,15 @@ diff2htmlUi.draw();
|
||||||
|
|
||||||
#### Syntax Highlight
|
#### Syntax Highlight
|
||||||
|
|
||||||
|
**NOTE:** The highlight.js css should come before the diff2html css
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!-- Stylesheet -->
|
<!-- Stylesheet -->
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/styles/github.min.css" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="bundles/css/diff2html.min.css" />
|
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css" />
|
||||||
|
|
||||||
<!-- Javascripts -->
|
<!-- Javascripts -->
|
||||||
<script type="text/javascript" src="bundles/js/diff2html-ui.min.js"></script>
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js"></script>
|
||||||
```
|
```
|
||||||
|
|
||||||
> Pass the option `highlight` with value true or invoke `diff2htmlUi.highlightCode()` after `diff2htmlUi.draw()`.
|
> Pass the option `highlight` with value true or invoke `diff2htmlUi.highlightCode()` after `diff2htmlUi.draw()`.
|
||||||
|
|
@ -369,27 +213,42 @@ diff2htmlUi.draw();
|
||||||
```js
|
```js
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
const diffString = `diff --git a/sample.js b/sample.js
|
const diffString = `diff --git a/sample.js b/sample.js
|
||||||
index 0000001..0ddf2ba
|
index 0000001..0ddf2ba
|
||||||
--- a/sample.js
|
--- a/sample.js
|
||||||
+++ b/sample.js
|
+++ b/sample.js
|
||||||
@@ -1 +1 @@
|
@@ -1 +1 @@
|
||||||
-console.log("Hello World!")
|
-console.log("Hello World!")
|
||||||
+console.log("Hello from Diff2Html!")`;
|
+console.log("Hello from Diff2Html!")`;
|
||||||
const targetElement = document.getElementById('myDiffElement');
|
const targetElement = document.getElementById('myDiffElement');
|
||||||
const configuration = { inputFormat: 'json', drawFileList: true, matching: 'lines', highlight: true };
|
const configuration = { drawFileList: true, matching: 'lines', highlight: true };
|
||||||
const diff2htmlUi = new Diff2HtmlUI(targetElement, diffString, configuration);
|
const diff2htmlUi = new Diff2HtmlUI(targetElement, diffString, configuration);
|
||||||
diff2htmlUi.draw();
|
diff2htmlUi.draw();
|
||||||
diff2htmlUi.highlightCode();
|
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
|
#### Collapsable File Summary List
|
||||||
|
|
||||||
> Add the dependencies.
|
> Add the dependencies.
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!-- Javascripts -->
|
<!-- Javascripts -->
|
||||||
<script type="text/javascript" src="bundles/js/diff2html-ui.min.js"></script>
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js"></script>
|
||||||
```
|
```
|
||||||
|
|
||||||
> Invoke the Diff2HtmlUI helper Pass the option `fileListToggle` with value true or invoke
|
> Invoke the Diff2HtmlUI helper Pass the option `fileListToggle` with value true or invoke
|
||||||
|
|
@ -404,6 +263,263 @@ 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
|
## Troubleshooting
|
||||||
|
|
||||||
### 1. Out of memory or Slow execution
|
### 1. Out of memory or Slow execution
|
||||||
|
|
@ -431,42 +547,53 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||||
<!-- markdownlint-disable -->
|
<!-- markdownlint-disable -->
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://rtfpessoa.xyz"><img src="https://avatars0.githubusercontent.com/u/902384?v=4" width="100px;" alt=""/><br /><sub><b>Rodrigo Fernandes</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=rtfpessoa" title="Code">💻</a></td>
|
<td align="center"><a href="https://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" 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/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" 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="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" 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://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" 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://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" 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="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" 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://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>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://saino.me/"><img src="https://avatars0.githubusercontent.com/u/1567423?v=4" width="100px;" alt=""/><br /><sub><b>Koki Oyatsu</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3Akaishuu0123" title="Bug reports">🐛</a></td>
|
<td align="center"><a href="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" 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://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" 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="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" 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://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" 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="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" 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="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" 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://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>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://twitter.com/pubkeypubkey"><img src="https://avatars3.githubusercontent.com/u/8926560?v=4" width="100px;" alt=""/><br /><sub><b>pubkey</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/commits?author=pubkey" title="Documentation">📖</a></td>
|
<td align="center"><a href="https://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" 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://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" 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://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" 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="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" 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="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" 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="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" 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>
|
<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>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><a href="https://github.com/Rantanen"><img src="https://avatars0.githubusercontent.com/u/385385?v=4" width="100px;" alt=""/><br /><sub><b>Mikko Rantanen</b></sub></a><br /><a href="https://github.com/rtfpessoa/diff2html/issues?q=author%3ARantanen" title="Bug reports">🐛</a></td>
|
<td align="center"><a href="https://github.com/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" 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/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" 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/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" 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="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" 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="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>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<!-- markdownlint-enable -->
|
<!-- markdownlint-restore -->
|
||||||
<!-- prettier-ignore-end -->
|
<!-- prettier-ignore-end -->
|
||||||
|
|
||||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||||
|
|
|
||||||
77
eslint.config.mjs
Normal file
77
eslint.config.mjs
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
import globals from 'globals';
|
||||||
|
import eslint from '@eslint/js';
|
||||||
|
import tseslint from 'typescript-eslint';
|
||||||
|
import pluginJest from 'eslint-plugin-jest';
|
||||||
|
import json from '@eslint/json';
|
||||||
|
import pluginPromise from 'eslint-plugin-promise';
|
||||||
|
|
||||||
|
export default [
|
||||||
|
{ ...eslint.configs.recommended, files: ['src/**/*.{js,mjs,cjs,ts}'] },
|
||||||
|
...tseslint.configs.recommended,
|
||||||
|
// ...tseslint.configs.recommendedTypeChecked,
|
||||||
|
// ...tseslint.configs.strict,
|
||||||
|
// ...tseslint.configs.stylistic,
|
||||||
|
// ...tseslint.configs.strictTypeChecked,
|
||||||
|
// ...tseslint.configs.stylisticTypeChecked,
|
||||||
|
{
|
||||||
|
rules: {
|
||||||
|
'@typescript-eslint/no-unused-vars': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
args: 'all',
|
||||||
|
argsIgnorePattern: '^_',
|
||||||
|
caughtErrors: 'all',
|
||||||
|
caughtErrorsIgnorePattern: '^_',
|
||||||
|
destructuredArrayIgnorePattern: '^_',
|
||||||
|
varsIgnorePattern: '^_',
|
||||||
|
ignoreRestSiblings: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
pluginPromise.configs['flat/recommended'],
|
||||||
|
{
|
||||||
|
plugins: {
|
||||||
|
json,
|
||||||
|
},
|
||||||
|
files: ['**/*.json'],
|
||||||
|
language: 'json/json',
|
||||||
|
rules: {
|
||||||
|
'json/no-duplicate-keys': 'error',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
...pluginJest.configs['flat/recommended'],
|
||||||
|
...pluginJest.configs['flat/style'],
|
||||||
|
files: ['src/__tests__/**/*tests.ts'],
|
||||||
|
plugins: { jest: pluginJest },
|
||||||
|
languageOptions: {
|
||||||
|
globals: pluginJest.environments.globals.globals,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
languageOptions: {
|
||||||
|
globals: {
|
||||||
|
...globals.browser,
|
||||||
|
...globals.node,
|
||||||
|
...globals.es2025,
|
||||||
|
Atomics: 'readonly',
|
||||||
|
SharedArrayBuffer: 'readonly',
|
||||||
|
document: 'readonly',
|
||||||
|
navigator: 'readonly',
|
||||||
|
window: 'readonly',
|
||||||
|
},
|
||||||
|
parserOptions: {
|
||||||
|
project: './tsconfig.eslint.json',
|
||||||
|
tsconfigRootDir: './',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ignores: ['src/diff2html-templates.*', 'coverage/', 'docs/', 'bundles-out/', 'bundles/', 'lib/', 'lib-esm/'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
...tseslint.configs.disableTypeChecked,
|
||||||
|
files: ['**/*.{js,mjs,cjs}'],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
@ -19,4 +19,5 @@ module.exports = {
|
||||||
lines: 93,
|
lines: 93,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
prettierPath: require.resolve('prettier-2'),
|
||||||
};
|
};
|
||||||
|
|
|
||||||
18121
package-lock.json
generated
Normal file
18121
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
171
package.json
171
package.json
|
|
@ -32,46 +32,42 @@
|
||||||
"url": "https://www.github.com/rtfpessoa/diff2html/issues"
|
"url": "https://www.github.com/rtfpessoa/diff2html/issues"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.13"
|
"node": ">=12"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"eslint": "eslint --ignore-path .gitignore \"**/*.{js,jsx,ts,tsx,json}\"",
|
"lint:staged": "lint-staged",
|
||||||
"lint:check": "yarn run eslint",
|
"lint:check": "eslint",
|
||||||
"lint:fix": "yarn run eslint --fix",
|
"lint:fix": "eslint --fix",
|
||||||
"prettier": "prettier --ignore-path .gitignore '**/*.+(js|jsx|ts|tsx|json|css|html|md|mdx)'",
|
"prettier": "prettier --ignore-path .gitignore '**/*.+(js|jsx|ts|tsx|json|css|html|md|mdx)'",
|
||||||
"format:check": "yarn run prettier --check",
|
"format:check": "npm run prettier --check",
|
||||||
"format:fix": "yarn run prettier --write",
|
"format:fix": "npm run prettier --write",
|
||||||
"build": "yarn run build:css && yarn run build:templates && yarn run build:es5 && yarn run build:esm && yarn run build:bundles && yarn run build:website",
|
"build": "npm run build:css && npm run build:templates && npm run build:commonjs && npm run build:esm && npm run build:bundles && npm run build:website",
|
||||||
"build:es5": "rm -rf lib; tsc -p tsconfig.json --outDir lib",
|
"build:commonjs": "rm -rf lib; tsc -p tsconfig.json -m CommonJS --outDir lib",
|
||||||
"build:esm": "rm -rf lib-esm; tsc -p tsconfig.json -m es6 --outDir lib-esm",
|
"build:esm": "rm -rf lib-esm; tsc -p tsconfig.json -m ESNext --outDir lib-esm",
|
||||||
"build:bundles": "rm -rf ./bundles/js; webpack ---display-reasons --display-modules --mode production --config webpack.bundles.ts",
|
"build:bundles": "rm -rf ./bundles/js; webpack --mode production --config webpack.bundles.ts",
|
||||||
"build:css": "rm -rf ./bundles/css; postcss --config ./postcss.config.js --no-map -o ./bundles/css/diff2html.min.css ./src/ui/css/diff2html.css",
|
"build:css": "rm -rf ./bundles/css; postcss --config ./postcss.config.js --no-map -o ./bundles/css/diff2html.min.css ./src/ui/css/diff2html.css",
|
||||||
"build:templates": "ts-node ./scripts/hulk.ts --wrapper ts --variable 'defaultTemplates' ./src/templates/*.mustache > ./src/diff2html-templates.ts",
|
"build:templates": "ts-node ./scripts/hulk.ts --wrapper ts --variable 'defaultTemplates' ./src/templates/*.mustache > ./src/diff2html-templates.ts",
|
||||||
"build:website": "rm -rf docs; webpack ---display-reasons --display-modules --mode production --config webpack.website.ts",
|
"build:website": "rm -rf docs; webpack --mode production --config webpack.website.ts",
|
||||||
"gen": "yarn run gen:toc",
|
"gen": "npm run gen:toc",
|
||||||
"gen:toc-base": "markdown-toc --maxdepth 3 --bullets='-' -i",
|
"gen:toc-base": "markdown-toc --maxdepth 3 --bullets='-' -i",
|
||||||
"gen:toc": "yarn run gen:toc-base README.md",
|
"gen:toc": "npm run gen:toc-base README.md",
|
||||||
"test": "is-ci 'test:coverage' 'test:watch'",
|
"test": "is-ci 'test:coverage' 'test:watch'",
|
||||||
"test:coverage": "jest --coverage",
|
"test:coverage": "jest --coverage",
|
||||||
"test:watch": "jest --watch",
|
"test:watch": "jest --watch",
|
||||||
"test:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand --watch",
|
"test:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand --watch",
|
||||||
"coverage:open": "yarn run test:coverage && open ./coverage/index.html",
|
"coverage:open": "npm run test:coverage && open ./coverage/index.html",
|
||||||
"coverage:push": "cat ./coverage/lcov.info | codacy-coverage",
|
"coverage:push": "curl -Ls https://coverage.codacy.com/get.sh | bash",
|
||||||
"validate": "yarn run build:templates && yarn run format:check && yarn run lint:check && yarn run build && yarn run test:coverage",
|
"validate": "npm run build:templates && npm run format:check && npm run lint:check && npm run build && npm run test:coverage",
|
||||||
"fix": "yarn run format:fix && yarn run lint:fix",
|
"fix": "npm run format:fix && npm run lint:fix",
|
||||||
"start": "yarn run start:website",
|
"start": "npm run start:website",
|
||||||
"start:website": "webpack-dev-server --mode development --config webpack.website.ts",
|
"start:website": "webpack serve --mode development --config webpack.website.ts",
|
||||||
"preversion": "yarn run validate",
|
"preversion": "npm run validate",
|
||||||
"version": "git add -A package.json"
|
"version": "git add -A package.json",
|
||||||
|
"prepare": "husky"
|
||||||
},
|
},
|
||||||
"main": "./lib/diff2html.js",
|
"main": "./lib/diff2html.js",
|
||||||
"module": "./lib-esm/diff2html.js",
|
"module": "./lib-esm/diff2html.js",
|
||||||
"types": "./lib/diff2html.d.ts",
|
"types": "./lib/diff2html.d.ts",
|
||||||
"husky": {
|
|
||||||
"hooks": {
|
|
||||||
"pre-commit": "lint-staged"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"**/*.+(js|jsx|ts|tsx|json)": [
|
"**/*.+(js|jsx|ts|tsx|json)": [
|
||||||
"prettier --write",
|
"prettier --write",
|
||||||
|
|
@ -81,78 +77,79 @@
|
||||||
"prettier --write"
|
"prettier --write"
|
||||||
],
|
],
|
||||||
"README.md": [
|
"README.md": [
|
||||||
"yarn run gen:toc-base"
|
"npm run gen:toc-base"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"diff": "4.0.2",
|
"diff": "^7.0.0",
|
||||||
"hogan.js": "3.0.2"
|
"hogan.js": "3.0.2"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"highlight.js": "9.18.1"
|
"highlight.js": "11.9.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/clipboard": "2.0.1",
|
"prettier-2": "npm:prettier@^2",
|
||||||
"@types/copy-webpack-plugin": "5.0.0",
|
"@eslint/js": "^9.17.0",
|
||||||
"@types/diff": "4.0.2",
|
"@eslint/json": "^0.9.0",
|
||||||
"@types/highlight.js": "9.12.3",
|
"@types/diff": "^6.0.0",
|
||||||
"@types/hogan.js": "3.0.0",
|
"@types/hogan.js": "3.0.5",
|
||||||
"@types/html-webpack-plugin": "3.2.2",
|
"@types/jest": "^29.5.14",
|
||||||
"@types/jest": "25.1.1",
|
"@types/node": "^22.10.2",
|
||||||
"@types/mini-css-extract-plugin": "0.9.0",
|
"@types/nopt": "3.0.32",
|
||||||
"@types/mkdirp": "0.5.2",
|
"all-contributors-cli": "^6.24.0",
|
||||||
"@types/node": "13.7.0",
|
"autoprefixer": "^10.4.20",
|
||||||
"@types/nopt": "3.0.29",
|
"bulma": "^1.0.2",
|
||||||
"@types/webpack": "4.41.5",
|
"clipboard": "2.0.11",
|
||||||
"@typescript-eslint/eslint-plugin": "2.19.0",
|
"copy-webpack-plugin": "^12.0.2",
|
||||||
"@typescript-eslint/parser": "2.19.0",
|
"css-loader": "^7.1.2",
|
||||||
"autoprefixer": "9.7.4",
|
"cssnano": "^7.0.6",
|
||||||
"bulma": "^0.8.0",
|
"eslint": "^9.17.0",
|
||||||
"clipboard": "2.0.4",
|
"eslint-plugin-jest": "28.10.0",
|
||||||
"codacy-coverage": "3.4.0",
|
"eslint-plugin-promise": "^7.2.1",
|
||||||
"copy-webpack-plugin": "5.1.1",
|
"file-loader": "6.2.0",
|
||||||
"css-loader": "3.4.2",
|
"globals": "^15.14.0",
|
||||||
"cssnano": "4.1.10",
|
"handlebars": "4.7.8",
|
||||||
"eslint": "6.8.0",
|
"handlebars-loader": "1.7.3",
|
||||||
"eslint-config-prettier": "6.10.0",
|
"html-webpack-plugin": "^5.6.3",
|
||||||
"eslint-plugin-import": "2.20.1",
|
"husky": "^9.1.7",
|
||||||
"eslint-plugin-jest": "23.6.0",
|
"image-webpack-loader": "8.1.0",
|
||||||
"eslint-plugin-json": "2.0.1",
|
"is-ci-cli": "2.2.0",
|
||||||
"eslint-plugin-node": "11.0.0",
|
"jest": "29.7.0",
|
||||||
"eslint-plugin-optimize-regex": "1.1.7",
|
"lint-staged": "^15.2.11",
|
||||||
"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",
|
"markdown-toc": "^1.2.0",
|
||||||
"mini-css-extract-plugin": "0.9.0",
|
"mini-css-extract-plugin": "^2.9.2",
|
||||||
"mkdirp": "1.0.3",
|
"mkdirp": "3.0.1",
|
||||||
"nopt": "4.0.1",
|
"nopt": "^8.0.0",
|
||||||
"postcss": "7.0.26",
|
"postcss": "^8.4.49",
|
||||||
"postcss-cli": "7.1.0",
|
"postcss-cli": "11.0.0",
|
||||||
"postcss-import": "12.0.1",
|
"postcss-import": "^16.1.0",
|
||||||
"postcss-loader": "3.0.0",
|
"postcss-loader": "^8.1.1",
|
||||||
"postcss-preset-env": "6.7.0",
|
"postcss-preset-env": "^10.1.2",
|
||||||
"prettier": "1.19.1",
|
"prettier": "^3.4.2",
|
||||||
"ts-jest": "25.2.0",
|
"ts-jest": "^29.2.5",
|
||||||
"ts-loader": "6.2.1",
|
"ts-loader": "9.5.1",
|
||||||
"ts-node": "8.6.2",
|
"ts-node": "10.9.2",
|
||||||
"typescript": "3.7.5",
|
"typescript": "^5.7.2",
|
||||||
"url-loader": "3.0.0",
|
"typescript-eslint": "^8.18.2",
|
||||||
"webpack": "4.41.5",
|
"url-loader": "4.1.1",
|
||||||
"webpack-cli": "3.3.10",
|
"webpack": "^5.97.1",
|
||||||
"webpack-dev-server": "3.10.3",
|
"webpack-cli": "^6.0.1",
|
||||||
"whatwg-fetch": "3.0.0"
|
"webpack-dev-server": "^5.2.0",
|
||||||
|
"whatwg-fetch": "3.6.20"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"lodash": "4.17.15"
|
"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"
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"files": [
|
"files": [
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,7 @@ function extractFiles(files: string[]): string[] {
|
||||||
`;
|
`;
|
||||||
|
|
||||||
if (options.version) {
|
if (options.version) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||||
console.log(require('../package.json').version);
|
console.log(require('../package.json').version);
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because one or more lines are too long
26
src/__tests__/diffs/bad-escaping.diff
Normal file
26
src/__tests__/diffs/bad-escaping.diff
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -1,176 +0,0 @@
|
||||||
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>"
|
|
||||||
`);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
272
src/__tests__/file-list-renderer-tests.ts
Normal file
272
src/__tests__/file-list-renderer-tests.ts
Normal file
|
|
@ -0,0 +1,272 @@
|
||||||
|
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(`
|
expect(result).toMatchInlineSnapshot(`
|
||||||
"<tr>
|
"<tr>
|
||||||
<td class=\\"d2h-info\\">
|
<td class="d2h-info">
|
||||||
<div class=\\"d2h-code-line d2h-info\\">
|
<div class="d2h-code-line">
|
||||||
File without changes
|
File without changes
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ describe('LineByLineRenderer', () => {
|
||||||
const fileHtml = lineByLineRenderer.generateEmptyDiff();
|
const fileHtml = lineByLineRenderer.generateEmptyDiff();
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"<tr>
|
"<tr>
|
||||||
<td class=\\"d2h-info\\">
|
<td class="d2h-info">
|
||||||
<div class=\\"d2h-code-line d2h-info\\">
|
<div class="d2h-code-line">
|
||||||
File without changes
|
File without changes
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
@ -23,9 +23,19 @@ describe('LineByLineRenderer', () => {
|
||||||
|
|
||||||
describe('makeLineHtml', () => {
|
describe('makeLineHtml', () => {
|
||||||
it('should work for insertions', () => {
|
it('should work for insertions', () => {
|
||||||
|
const file = {
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
};
|
||||||
const hoganUtils = new HoganJsUtils({});
|
const hoganUtils = new HoganJsUtils({});
|
||||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||||
type: CSSLineClass.INSERTS,
|
type: CSSLineClass.INSERTS,
|
||||||
prefix: '+',
|
prefix: '+',
|
||||||
content: 'test',
|
content: 'test',
|
||||||
|
|
@ -34,14 +44,14 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"<tr>
|
"<tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-ins\\">
|
<td class="d2h-code-linenumber d2h-ins">
|
||||||
<div class=\\"line-num1\\"></div>
|
<div class="line-num1"></div>
|
||||||
<div class=\\"line-num2\\">30</div>
|
<div class="line-num2">30</div>
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins\\">
|
<td class="d2h-ins">
|
||||||
<div class=\\"d2h-code-line d2h-ins\\">
|
<div class="d2h-code-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\">test</span>
|
<span class="d2h-code-line-ctn">test</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>"
|
</tr>"
|
||||||
|
|
@ -49,9 +59,19 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should work for deletions', () => {
|
it('should work for deletions', () => {
|
||||||
|
const file = {
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
};
|
||||||
const hoganUtils = new HoganJsUtils({});
|
const hoganUtils = new HoganJsUtils({});
|
||||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||||
type: CSSLineClass.DELETES,
|
type: CSSLineClass.DELETES,
|
||||||
prefix: '-',
|
prefix: '-',
|
||||||
content: 'test',
|
content: 'test',
|
||||||
|
|
@ -60,14 +80,14 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"<tr>
|
"<tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-del\\">
|
<td class="d2h-code-linenumber d2h-del">
|
||||||
<div class=\\"line-num1\\">30</div>
|
<div class="line-num1">30</div>
|
||||||
<div class=\\"line-num2\\"></div>
|
<div class="line-num2"></div>
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-del\\">
|
<td class="d2h-del">
|
||||||
<div class=\\"d2h-code-line d2h-del\\">
|
<div class="d2h-code-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\">test</span>
|
<span class="d2h-code-line-ctn">test</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>"
|
</tr>"
|
||||||
|
|
@ -75,9 +95,19 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should convert indents into non breakin spaces (2 white spaces)', () => {
|
it('should convert indents into non breakin spaces (2 white spaces)', () => {
|
||||||
|
const file = {
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
};
|
||||||
const hoganUtils = new HoganJsUtils({});
|
const hoganUtils = new HoganJsUtils({});
|
||||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||||
type: CSSLineClass.INSERTS,
|
type: CSSLineClass.INSERTS,
|
||||||
prefix: '+',
|
prefix: '+',
|
||||||
content: ' test',
|
content: ' test',
|
||||||
|
|
@ -86,14 +116,14 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"<tr>
|
"<tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-ins\\">
|
<td class="d2h-code-linenumber d2h-ins">
|
||||||
<div class=\\"line-num1\\"></div>
|
<div class="line-num1"></div>
|
||||||
<div class=\\"line-num2\\">30</div>
|
<div class="line-num2">30</div>
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins\\">
|
<td class="d2h-ins">
|
||||||
<div class=\\"d2h-code-line d2h-ins\\">
|
<div class="d2h-code-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"> test</span>
|
<span class="d2h-code-line-ctn"> test</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>"
|
</tr>"
|
||||||
|
|
@ -101,9 +131,19 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should convert indents into non breakin spaces (4 white spaces)', () => {
|
it('should convert indents into non breakin spaces (4 white spaces)', () => {
|
||||||
|
const file = {
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
};
|
||||||
const hoganUtils = new HoganJsUtils({});
|
const hoganUtils = new HoganJsUtils({});
|
||||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||||
type: CSSLineClass.INSERTS,
|
type: CSSLineClass.INSERTS,
|
||||||
prefix: '+',
|
prefix: '+',
|
||||||
content: ' test',
|
content: ' test',
|
||||||
|
|
@ -112,14 +152,14 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"<tr>
|
"<tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-ins\\">
|
<td class="d2h-code-linenumber d2h-ins">
|
||||||
<div class=\\"line-num1\\"></div>
|
<div class="line-num1"></div>
|
||||||
<div class=\\"line-num2\\">30</div>
|
<div class="line-num2">30</div>
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins\\">
|
<td class="d2h-ins">
|
||||||
<div class=\\"d2h-code-line d2h-ins\\">
|
<div class="d2h-code-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"> test</span>
|
<span class="d2h-code-line-ctn"> test</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>"
|
</tr>"
|
||||||
|
|
@ -127,9 +167,19 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should preserve tabs', () => {
|
it('should preserve tabs', () => {
|
||||||
|
const file = {
|
||||||
|
addedLines: 12,
|
||||||
|
deletedLines: 41,
|
||||||
|
language: 'js',
|
||||||
|
oldName: 'my/file/name.js',
|
||||||
|
newName: 'my/file/name.js',
|
||||||
|
isCombined: false,
|
||||||
|
isGitDiff: false,
|
||||||
|
blocks: [],
|
||||||
|
};
|
||||||
const hoganUtils = new HoganJsUtils({});
|
const hoganUtils = new HoganJsUtils({});
|
||||||
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
const lineByLineRenderer = new LineByLineRenderer(hoganUtils, {});
|
||||||
const fileHtml = lineByLineRenderer.generateSingleLineHtml({
|
const fileHtml = lineByLineRenderer.generateSingleLineHtml(file, {
|
||||||
type: CSSLineClass.INSERTS,
|
type: CSSLineClass.INSERTS,
|
||||||
prefix: '+',
|
prefix: '+',
|
||||||
content: '\ttest',
|
content: '\ttest',
|
||||||
|
|
@ -138,14 +188,14 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"<tr>
|
"<tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-ins\\">
|
<td class="d2h-code-linenumber d2h-ins">
|
||||||
<div class=\\"line-num1\\"></div>
|
<div class="line-num1"></div>
|
||||||
<div class=\\"line-num2\\">30</div>
|
<div class="line-num2">30</div>
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins\\">
|
<td class="d2h-ins">
|
||||||
<div class=\\"d2h-code-line d2h-ins\\">
|
<div class="d2h-code-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"> test</span>
|
<span class="d2h-code-line-ctn"> test</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>"
|
</tr>"
|
||||||
|
|
@ -173,18 +223,22 @@ describe('LineByLineRenderer', () => {
|
||||||
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
||||||
|
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"<div id=\\"d2h-781444\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
"<div id="d2h-781444" class="d2h-file-wrapper" data-lang="js">
|
||||||
<div class=\\"d2h-file-header\\">
|
<div class="d2h-file-header">
|
||||||
<span class=\\"d2h-file-name-wrapper\\">
|
<span class="d2h-file-name-wrapper">
|
||||||
<svg aria-hidden=\\"true\\" class=\\"d2h-icon\\" height=\\"16\\" version=\\"1.1\\" viewBox=\\"0 0 12 16\\" width=\\"12\\">
|
<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>
|
<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>
|
</svg> <span class="d2h-file-name">my/file/name.js</span>
|
||||||
<span class=\\"d2h-tag d2h-changed d2h-changed-tag\\">CHANGED</span></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>
|
||||||
<div class=\\"d2h-file-diff\\">
|
<div class="d2h-file-diff">
|
||||||
<div class=\\"d2h-code-wrapper\\">
|
<div class="d2h-code-wrapper">
|
||||||
<table class=\\"d2h-diff-table\\">
|
<table class="d2h-diff-table">
|
||||||
<tbody class=\\"d2h-diff-tbody\\">
|
<tbody class="d2h-diff-tbody">
|
||||||
<span>Random Html</span>
|
<span>Random Html</span>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
@ -213,18 +267,22 @@ describe('LineByLineRenderer', () => {
|
||||||
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
||||||
|
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"<div id=\\"d2h-781444\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
"<div id="d2h-781444" class="d2h-file-wrapper" data-lang="js">
|
||||||
<div class=\\"d2h-file-header\\">
|
<div class="d2h-file-header">
|
||||||
<span class=\\"d2h-file-name-wrapper\\">
|
<span class="d2h-file-name-wrapper">
|
||||||
<svg aria-hidden=\\"true\\" class=\\"d2h-icon\\" height=\\"16\\" version=\\"1.1\\" viewBox=\\"0 0 12 16\\" width=\\"12\\">
|
<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>
|
<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>
|
</svg> <span class="d2h-file-name">my/file/name.js</span>
|
||||||
<span class=\\"d2h-tag d2h-added d2h-added-tag\\">ADDED</span></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>
|
</div>
|
||||||
<div class=\\"d2h-file-diff\\">
|
<div class="d2h-file-diff">
|
||||||
<div class=\\"d2h-code-wrapper\\">
|
<div class="d2h-code-wrapper">
|
||||||
<table class=\\"d2h-diff-table\\">
|
<table class="d2h-diff-table">
|
||||||
<tbody class=\\"d2h-diff-tbody\\">
|
<tbody class="d2h-diff-tbody">
|
||||||
<span>Random Html</span>
|
<span>Random Html</span>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
@ -253,18 +311,22 @@ describe('LineByLineRenderer', () => {
|
||||||
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
||||||
|
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"<div id=\\"d2h-781444\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
"<div id="d2h-781444" class="d2h-file-wrapper" data-lang="js">
|
||||||
<div class=\\"d2h-file-header\\">
|
<div class="d2h-file-header">
|
||||||
<span class=\\"d2h-file-name-wrapper\\">
|
<span class="d2h-file-name-wrapper">
|
||||||
<svg aria-hidden=\\"true\\" class=\\"d2h-icon\\" height=\\"16\\" version=\\"1.1\\" viewBox=\\"0 0 12 16\\" width=\\"12\\">
|
<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>
|
<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>
|
</svg> <span class="d2h-file-name">my/file/name.js</span>
|
||||||
<span class=\\"d2h-tag d2h-deleted d2h-deleted-tag\\">DELETED</span></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>
|
</div>
|
||||||
<div class=\\"d2h-file-diff\\">
|
<div class="d2h-file-diff">
|
||||||
<div class=\\"d2h-code-wrapper\\">
|
<div class="d2h-code-wrapper">
|
||||||
<table class=\\"d2h-diff-table\\">
|
<table class="d2h-diff-table">
|
||||||
<tbody class=\\"d2h-diff-tbody\\">
|
<tbody class="d2h-diff-tbody">
|
||||||
<span>Random Html</span>
|
<span>Random Html</span>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
@ -293,18 +355,22 @@ describe('LineByLineRenderer', () => {
|
||||||
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
const fileHtml = lineByLineRenderer.makeFileDiffHtml(file, diffs);
|
||||||
|
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
"<div id=\\"d2h-662683\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
"<div id="d2h-662683" class="d2h-file-wrapper" data-lang="js">
|
||||||
<div class=\\"d2h-file-header\\">
|
<div class="d2h-file-header">
|
||||||
<span class=\\"d2h-file-name-wrapper\\">
|
<span class="d2h-file-name-wrapper">
|
||||||
<svg aria-hidden=\\"true\\" class=\\"d2h-icon\\" height=\\"16\\" version=\\"1.1\\" viewBox=\\"0 0 12 16\\" width=\\"12\\">
|
<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>
|
<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>
|
</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>
|
<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>
|
</div>
|
||||||
<div class=\\"d2h-file-diff\\">
|
<div class="d2h-file-diff">
|
||||||
<div class=\\"d2h-code-wrapper\\">
|
<div class="d2h-code-wrapper">
|
||||||
<table class=\\"d2h-diff-table\\">
|
<table class="d2h-diff-table">
|
||||||
<tbody class=\\"d2h-diff-tbody\\">
|
<tbody class="d2h-diff-tbody">
|
||||||
<span>Random Html</span>
|
<span>Random Html</span>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
@ -383,44 +449,48 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
const html = lineByLineRenderer.render(exampleJson);
|
const html = lineByLineRenderer.render(exampleJson);
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
"<div class=\\"d2h-wrapper\\">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id=\\"d2h-675094\\" class=\\"d2h-file-wrapper\\" data-lang=\\"txt\\">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="txt">
|
||||||
<div class=\\"d2h-file-header\\">
|
<div class="d2h-file-header">
|
||||||
<span class=\\"d2h-file-name-wrapper\\">
|
<span class="d2h-file-name-wrapper">
|
||||||
<svg aria-hidden=\\"true\\" class=\\"d2h-icon\\" height=\\"16\\" version=\\"1.1\\" viewBox=\\"0 0 12 16\\" width=\\"12\\">
|
<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>
|
<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>
|
</svg> <span class="d2h-file-name">sample</span>
|
||||||
<span class=\\"d2h-tag d2h-changed d2h-changed-tag\\">CHANGED</span></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>
|
||||||
<div class=\\"d2h-file-diff\\">
|
<div class="d2h-file-diff">
|
||||||
<div class=\\"d2h-code-wrapper\\">
|
<div class="d2h-code-wrapper">
|
||||||
<table class=\\"d2h-diff-table\\">
|
<table class="d2h-diff-table">
|
||||||
<tbody class=\\"d2h-diff-tbody\\">
|
<tbody class="d2h-diff-tbody">
|
||||||
<tr>
|
<tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-info\\"></td>
|
<td class="d2h-code-linenumber d2h-info"></td>
|
||||||
<td class=\\"d2h-info\\">
|
<td class="d2h-info">
|
||||||
<div class=\\"d2h-code-line d2h-info\\">@@ -1 +1 @@</div>
|
<div class="d2h-code-line">@@ -1 +1 @@</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-del d2h-change\\">
|
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||||||
<div class=\\"line-num1\\">1</div>
|
<div class="line-num1">1</div>
|
||||||
<div class=\\"line-num2\\"></div>
|
<div class="line-num2"></div>
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-del d2h-change\\">
|
<td class="d2h-del d2h-change">
|
||||||
<div class=\\"d2h-code-line d2h-del d2h-change\\">
|
<div class="d2h-code-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"><del>test</del></span>
|
<span class="d2h-code-line-ctn"><del>test</del></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-ins d2h-change\\">
|
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||||||
<div class=\\"line-num1\\"></div>
|
<div class="line-num1"></div>
|
||||||
<div class=\\"line-num2\\">1</div>
|
<div class="line-num2">1</div>
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins d2h-change\\">
|
<td class="d2h-ins d2h-change">
|
||||||
<div class=\\"d2h-code-line d2h-ins d2h-change\\">
|
<div class="d2h-code-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"><ins>test1r</ins></span>
|
<span class="d2h-code-line-ctn"><ins>test1r</ins></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
@ -453,22 +523,26 @@ describe('LineByLineRenderer', () => {
|
||||||
});
|
});
|
||||||
const html = lineByLineRenderer.render(exampleJson);
|
const html = lineByLineRenderer.render(exampleJson);
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
"<div class=\\"d2h-wrapper\\">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id=\\"d2h-675094\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
||||||
<div class=\\"d2h-file-header\\">
|
<div class="d2h-file-header">
|
||||||
<span class=\\"d2h-file-name-wrapper\\">
|
<span class="d2h-file-name-wrapper">
|
||||||
<svg aria-hidden=\\"true\\" class=\\"d2h-icon\\" height=\\"16\\" version=\\"1.1\\" viewBox=\\"0 0 12 16\\" width=\\"12\\">
|
<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>
|
<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>
|
</svg> <span class="d2h-file-name">sample</span>
|
||||||
<span class=\\"d2h-tag d2h-changed d2h-changed-tag\\">CHANGED</span></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>
|
||||||
<div class=\\"d2h-file-diff\\">
|
<div class="d2h-file-diff">
|
||||||
<div class=\\"d2h-code-wrapper\\">
|
<div class="d2h-code-wrapper">
|
||||||
<table class=\\"d2h-diff-table\\">
|
<table class="d2h-diff-table">
|
||||||
<tbody class=\\"d2h-diff-tbody\\">
|
<tbody class="d2h-diff-tbody">
|
||||||
<tr>
|
<tr>
|
||||||
<td class=\\"d2h-info\\">
|
<td class="d2h-info">
|
||||||
<div class=\\"d2h-code-line d2h-info\\">
|
<div class="d2h-code-line">
|
||||||
File without changes
|
File without changes
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
@ -481,6 +555,65 @@ describe('LineByLineRenderer', () => {
|
||||||
</div>"
|
</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', () => {
|
describe('_generateFileHtml', () => {
|
||||||
|
|
@ -537,52 +670,52 @@ describe('LineByLineRenderer', () => {
|
||||||
|
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
"<tr>
|
"<tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-info\\"></td>
|
<td class="d2h-code-linenumber d2h-info"></td>
|
||||||
<td class=\\"d2h-info\\">
|
<td class="d2h-info">
|
||||||
<div class=\\"d2h-code-line d2h-info\\">@@ -1 +1 @@</div>
|
<div class="d2h-code-line">@@ -1 +1 @@</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-cntx\\">
|
<td class="d2h-code-linenumber d2h-cntx">
|
||||||
<div class=\\"line-num1\\">1</div>
|
<div class="line-num1">1</div>
|
||||||
<div class=\\"line-num2\\">1</div>
|
<div class="line-num2">1</div>
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-cntx\\">
|
<td class="d2h-cntx">
|
||||||
<div class=\\"d2h-code-line d2h-cntx\\">
|
<div class="d2h-code-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\"> </span>
|
<span class="d2h-code-line-prefix"> </span>
|
||||||
<span class=\\"d2h-code-line-ctn\\">one context line</span>
|
<span class="d2h-code-line-ctn">one context line</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-del d2h-change\\">
|
<td class="d2h-code-linenumber d2h-del d2h-change">
|
||||||
<div class=\\"line-num1\\">2</div>
|
<div class="line-num1">2</div>
|
||||||
<div class=\\"line-num2\\"></div>
|
<div class="line-num2"></div>
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-del d2h-change\\">
|
<td class="d2h-del d2h-change">
|
||||||
<div class=\\"d2h-code-line d2h-del d2h-change\\">
|
<div class="d2h-code-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"><del>test</del></span>
|
<span class="d2h-code-line-ctn"><del>test</del></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-ins d2h-change\\">
|
<td class="d2h-code-linenumber d2h-ins d2h-change">
|
||||||
<div class=\\"line-num1\\"></div>
|
<div class="line-num1"></div>
|
||||||
<div class=\\"line-num2\\">2</div>
|
<div class="line-num2">2</div>
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins d2h-change\\">
|
<td class="d2h-ins d2h-change">
|
||||||
<div class=\\"d2h-code-line d2h-ins d2h-change\\">
|
<div class="d2h-code-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"><ins>test1r</ins></span>
|
<span class="d2h-code-line-ctn"><ins>test1r</ins></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-linenumber d2h-ins\\">
|
<td class="d2h-code-linenumber d2h-ins">
|
||||||
<div class=\\"line-num1\\"></div>
|
<div class="line-num1"></div>
|
||||||
<div class=\\"line-num2\\">3</div>
|
<div class="line-num2">3</div>
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins\\">
|
<td class="d2h-ins">
|
||||||
<div class=\\"d2h-code-line d2h-ins\\">
|
<div class="d2h-code-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\">test2r</span>
|
<span class="d2h-code-line-ctn">test2r</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>"
|
</tr>"
|
||||||
|
|
|
||||||
|
|
@ -5,31 +5,31 @@ describe('Utils', () => {
|
||||||
describe('escapeForHtml', () => {
|
describe('escapeForHtml', () => {
|
||||||
it('should escape & with &', () => {
|
it('should escape & with &', () => {
|
||||||
const result = escapeForHtml('&');
|
const result = escapeForHtml('&');
|
||||||
expect(result).toEqual('&');
|
expect(result).toBe('&');
|
||||||
});
|
});
|
||||||
it('should escape < with <', () => {
|
it('should escape < with <', () => {
|
||||||
const result = escapeForHtml('<');
|
const result = escapeForHtml('<');
|
||||||
expect(result).toEqual('<');
|
expect(result).toBe('<');
|
||||||
});
|
});
|
||||||
it('should escape > with >', () => {
|
it('should escape > with >', () => {
|
||||||
const result = escapeForHtml('>');
|
const result = escapeForHtml('>');
|
||||||
expect(result).toEqual('>');
|
expect(result).toBe('>');
|
||||||
});
|
});
|
||||||
it('should escape " with "', () => {
|
it('should escape " with "', () => {
|
||||||
const result = escapeForHtml('"');
|
const result = escapeForHtml('"');
|
||||||
expect(result).toEqual('"');
|
expect(result).toBe('"');
|
||||||
});
|
});
|
||||||
it("should escape ' with '", () => {
|
it("should escape ' with '", () => {
|
||||||
const result = escapeForHtml("'");
|
const result = escapeForHtml("'");
|
||||||
expect(result).toEqual(''');
|
expect(result).toBe(''');
|
||||||
});
|
});
|
||||||
it('should escape / with /', () => {
|
it('should escape / with /', () => {
|
||||||
const result = escapeForHtml('/');
|
const result = escapeForHtml('/');
|
||||||
expect(result).toEqual('/');
|
expect(result).toBe('/');
|
||||||
});
|
});
|
||||||
it('should escape a string containing HTML code', () => {
|
it('should escape a string containing HTML code', () => {
|
||||||
const result = escapeForHtml(`<a href="/search?q=diff2html">Search 'Diff2Html'</a>`);
|
const result = escapeForHtml(`<a href="/search?q=diff2html">Search 'Diff2Html'</a>`);
|
||||||
expect(result).toEqual(
|
expect(result).toBe(
|
||||||
'<a href="/search?q=diff2html">Search 'Diff2Html'</a>',
|
'<a href="/search?q=diff2html">Search 'Diff2Html'</a>',
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
@ -41,7 +41,7 @@ describe('Utils', () => {
|
||||||
oldName: 'sample.js',
|
oldName: 'sample.js',
|
||||||
newName: 'sample.js',
|
newName: 'sample.js',
|
||||||
});
|
});
|
||||||
expect(result).toEqual('d2h-960013');
|
expect(result).toBe('d2h-960013');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -51,49 +51,49 @@ describe('Utils', () => {
|
||||||
oldName: 'sample.js',
|
oldName: 'sample.js',
|
||||||
newName: 'sample.js',
|
newName: 'sample.js',
|
||||||
});
|
});
|
||||||
expect(result).toEqual('sample.js');
|
expect(result).toBe('sample.js');
|
||||||
});
|
});
|
||||||
it('should generate the file name for a changed file and full rename', () => {
|
it('should generate the file name for a changed file and full rename', () => {
|
||||||
const result = filenameDiff({
|
const result = filenameDiff({
|
||||||
oldName: 'sample1.js',
|
oldName: 'sample1.js',
|
||||||
newName: 'sample2.js',
|
newName: 'sample2.js',
|
||||||
});
|
});
|
||||||
expect(result).toEqual('sample1.js → sample2.js');
|
expect(result).toBe('sample1.js → sample2.js');
|
||||||
});
|
});
|
||||||
it('should generate the file name for a changed file and prefix rename', () => {
|
it('should generate the file name for a changed file and prefix rename', () => {
|
||||||
const result = filenameDiff({
|
const result = filenameDiff({
|
||||||
oldName: 'src/path/sample.js',
|
oldName: 'src/path/sample.js',
|
||||||
newName: 'source/path/sample.js',
|
newName: 'source/path/sample.js',
|
||||||
});
|
});
|
||||||
expect(result).toEqual('{src → source}/path/sample.js');
|
expect(result).toBe('{src → source}/path/sample.js');
|
||||||
});
|
});
|
||||||
it('should generate the file name for a changed file and suffix rename', () => {
|
it('should generate the file name for a changed file and suffix rename', () => {
|
||||||
const result = filenameDiff({
|
const result = filenameDiff({
|
||||||
oldName: 'src/path/sample1.js',
|
oldName: 'src/path/sample1.js',
|
||||||
newName: 'src/path/sample2.js',
|
newName: 'src/path/sample2.js',
|
||||||
});
|
});
|
||||||
expect(result).toEqual('src/path/{sample1.js → sample2.js}');
|
expect(result).toBe('src/path/{sample1.js → sample2.js}');
|
||||||
});
|
});
|
||||||
it('should generate the file name for a changed file and middle rename', () => {
|
it('should generate the file name for a changed file and middle rename', () => {
|
||||||
const result = filenameDiff({
|
const result = filenameDiff({
|
||||||
oldName: 'src/really/big/path/sample.js',
|
oldName: 'src/really/big/path/sample.js',
|
||||||
newName: 'src/small/path/sample.js',
|
newName: 'src/small/path/sample.js',
|
||||||
});
|
});
|
||||||
expect(result).toEqual('src/{really/big → small}/path/sample.js');
|
expect(result).toBe('src/{really/big → small}/path/sample.js');
|
||||||
});
|
});
|
||||||
it('should generate the file name for a deleted file', () => {
|
it('should generate the file name for a deleted file', () => {
|
||||||
const result = filenameDiff({
|
const result = filenameDiff({
|
||||||
oldName: 'src/my/file.js',
|
oldName: 'src/my/file.js',
|
||||||
newName: '/dev/null',
|
newName: '/dev/null',
|
||||||
});
|
});
|
||||||
expect(result).toEqual('src/my/file.js');
|
expect(result).toBe('src/my/file.js');
|
||||||
});
|
});
|
||||||
it('should generate the file name for a new file', () => {
|
it('should generate the file name for a new file', () => {
|
||||||
const result = filenameDiff({
|
const result = filenameDiff({
|
||||||
oldName: '/dev/null',
|
oldName: '/dev/null',
|
||||||
newName: 'src/my/file.js',
|
newName: 'src/my/file.js',
|
||||||
});
|
});
|
||||||
expect(result).toEqual('src/my/file.js');
|
expect(result).toBe('src/my/file.js');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,10 @@ describe('SideBySideRenderer', () => {
|
||||||
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {});
|
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {});
|
||||||
const fileHtml = sideBySideRenderer.generateEmptyDiff();
|
const fileHtml = sideBySideRenderer.generateEmptyDiff();
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
Object {
|
{
|
||||||
"left": "<tr>
|
"left": "<tr>
|
||||||
<td class=\\"d2h-info\\">
|
<td class="d2h-info">
|
||||||
<div class=\\"d2h-code-side-line d2h-info\\">
|
<div class="d2h-code-side-line">
|
||||||
File without changes
|
File without changes
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
@ -78,76 +78,76 @@ describe('SideBySideRenderer', () => {
|
||||||
const fileHtml = sideBySideRenderer.generateFileHtml(file);
|
const fileHtml = sideBySideRenderer.generateFileHtml(file);
|
||||||
|
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
Object {
|
{
|
||||||
"left": "<tr>
|
"left": "<tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-info\\"></td>
|
<td class="d2h-code-side-linenumber d2h-info"></td>
|
||||||
<td class=\\"d2h-info\\">
|
<td class="d2h-info">
|
||||||
<div class=\\"d2h-code-side-line d2h-info\\">@@ -19,7 +19,7 @@</div>
|
<div class="d2h-code-side-line">@@ -19,7 +19,7 @@</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-cntx\\">
|
<td class="d2h-code-side-linenumber d2h-cntx">
|
||||||
19
|
19
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-cntx\\">
|
<td class="d2h-cntx">
|
||||||
<div class=\\"d2h-code-side-line d2h-cntx\\">
|
<div class="d2h-code-side-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\"> </span>
|
<span class="d2h-code-line-prefix"> </span>
|
||||||
<span class=\\"d2h-code-line-ctn\\">context</span>
|
<span class="d2h-code-line-ctn">context</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-del d2h-change\\">
|
<td class="d2h-code-side-linenumber d2h-del d2h-change">
|
||||||
20
|
20
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-del d2h-change\\">
|
<td class="d2h-del d2h-change">
|
||||||
<div class=\\"d2h-code-side-line d2h-del d2h-change\\">
|
<div class="d2h-code-side-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"><del>removed</del></span>
|
<span class="d2h-code-line-ctn"><del>removed</del></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</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>
|
||||||
<td class=\\"d2h-cntx d2h-emptyplaceholder\\">
|
<td class="d2h-cntx d2h-emptyplaceholder">
|
||||||
<div class=\\"d2h-code-side-line d2h-code-side-emptyplaceholder 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-prefix"> </span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"> </span>
|
<span class="d2h-code-line-ctn"><br></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>",
|
</tr>",
|
||||||
"right": "<tr>
|
"right": "<tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-info\\"></td>
|
<td class="d2h-code-side-linenumber d2h-info"></td>
|
||||||
<td class=\\"d2h-info\\">
|
<td class="d2h-info">
|
||||||
<div class=\\"d2h-code-side-line d2h-info\\"></div>
|
<div class="d2h-code-side-line"> </div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-cntx\\">
|
<td class="d2h-code-side-linenumber d2h-cntx">
|
||||||
19
|
19
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-cntx\\">
|
<td class="d2h-cntx">
|
||||||
<div class=\\"d2h-code-side-line d2h-cntx\\">
|
<div class="d2h-code-side-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\"> </span>
|
<span class="d2h-code-line-prefix"> </span>
|
||||||
<span class=\\"d2h-code-line-ctn\\">context</span>
|
<span class="d2h-code-line-ctn">context</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-ins d2h-change\\">
|
<td class="d2h-code-side-linenumber d2h-ins d2h-change">
|
||||||
20
|
20
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins d2h-change\\">
|
<td class="d2h-ins d2h-change">
|
||||||
<div class=\\"d2h-code-side-line d2h-ins d2h-change\\">
|
<div class="d2h-code-side-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"><ins>added</ins></span>
|
<span class="d2h-code-line-ctn"><ins>added</ins></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-ins\\">
|
<td class="d2h-code-side-linenumber d2h-ins">
|
||||||
21
|
21
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins\\">
|
<td class="d2h-ins">
|
||||||
<div class=\\"d2h-code-side-line d2h-ins\\">
|
<div class="d2h-code-side-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\">another added</span>
|
<span class="d2h-code-line-ctn">another added</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>",
|
</tr>",
|
||||||
|
|
@ -168,26 +168,26 @@ describe('SideBySideRenderer', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
Object {
|
{
|
||||||
"left": "<tr>
|
"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>
|
||||||
<td class=\\"d2h-cntx d2h-emptyplaceholder\\">
|
<td class="d2h-cntx d2h-emptyplaceholder">
|
||||||
<div class=\\"d2h-code-side-line d2h-code-side-emptyplaceholder 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-prefix"> </span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"> </span>
|
<span class="d2h-code-line-ctn"><br></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>",
|
</tr>",
|
||||||
"right": "<tr>
|
"right": "<tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-ins\\">
|
<td class="d2h-code-side-linenumber d2h-ins">
|
||||||
30
|
30
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins\\">
|
<td class="d2h-ins">
|
||||||
<div class=\\"d2h-code-side-line d2h-ins\\">
|
<div class="d2h-code-side-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\">test</span>
|
<span class="d2h-code-line-ctn">test</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>",
|
</tr>",
|
||||||
|
|
@ -208,26 +208,26 @@ describe('SideBySideRenderer', () => {
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(fileHtml).toMatchInlineSnapshot(`
|
expect(fileHtml).toMatchInlineSnapshot(`
|
||||||
Object {
|
{
|
||||||
"left": "<tr>
|
"left": "<tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-del\\">
|
<td class="d2h-code-side-linenumber d2h-del">
|
||||||
30
|
30
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-del\\">
|
<td class="d2h-del">
|
||||||
<div class=\\"d2h-code-side-line d2h-del\\">
|
<div class="d2h-code-side-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\">test</span>
|
<span class="d2h-code-line-ctn">test</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>",
|
</tr>",
|
||||||
"right": "<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>
|
||||||
<td class=\\"d2h-cntx d2h-emptyplaceholder\\">
|
<td class="d2h-cntx d2h-emptyplaceholder">
|
||||||
<div class=\\"d2h-code-side-line d2h-code-side-emptyplaceholder 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-prefix"> </span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"> </span>
|
<span class="d2h-code-line-ctn"><br></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>",
|
</tr>",
|
||||||
|
|
@ -278,33 +278,37 @@ describe('SideBySideRenderer', () => {
|
||||||
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, { matching: LineMatchingType.LINES });
|
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, { matching: LineMatchingType.LINES });
|
||||||
const html = sideBySideRenderer.render(exampleJson);
|
const html = sideBySideRenderer.render(exampleJson);
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
"<div class=\\"d2h-wrapper\\">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id=\\"d2h-675094\\" class=\\"d2h-file-wrapper\\" data-lang=\\"txt\\">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="txt">
|
||||||
<div class=\\"d2h-file-header\\">
|
<div class="d2h-file-header">
|
||||||
<span class=\\"d2h-file-name-wrapper\\">
|
<span class="d2h-file-name-wrapper">
|
||||||
<svg aria-hidden=\\"true\\" class=\\"d2h-icon\\" height=\\"16\\" version=\\"1.1\\" viewBox=\\"0 0 12 16\\" width=\\"12\\">
|
<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>
|
<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>
|
</svg> <span class="d2h-file-name">sample</span>
|
||||||
<span class=\\"d2h-tag d2h-changed d2h-changed-tag\\">CHANGED</span></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>
|
||||||
<div class=\\"d2h-files-diff\\">
|
<div class="d2h-files-diff">
|
||||||
<div class=\\"d2h-file-side-diff\\">
|
<div class="d2h-file-side-diff">
|
||||||
<div class=\\"d2h-code-wrapper\\">
|
<div class="d2h-code-wrapper">
|
||||||
<table class=\\"d2h-diff-table\\">
|
<table class="d2h-diff-table">
|
||||||
<tbody class=\\"d2h-diff-tbody\\">
|
<tbody class="d2h-diff-tbody">
|
||||||
<tr>
|
<tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-info\\"></td>
|
<td class="d2h-code-side-linenumber d2h-info"></td>
|
||||||
<td class=\\"d2h-info\\">
|
<td class="d2h-info">
|
||||||
<div class=\\"d2h-code-side-line d2h-info\\">@@ -1 +1 @@</div>
|
<div class="d2h-code-side-line">@@ -1 +1 @@</div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-del d2h-change\\">
|
<td class="d2h-code-side-linenumber d2h-del d2h-change">
|
||||||
1
|
1
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-del d2h-change\\">
|
<td class="d2h-del d2h-change">
|
||||||
<div class=\\"d2h-code-side-line d2h-del d2h-change\\">
|
<div class="d2h-code-side-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"><del>test</del></span>
|
<span class="d2h-code-line-ctn"><del>test</del></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
@ -312,23 +316,23 @@ describe('SideBySideRenderer', () => {
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class=\\"d2h-file-side-diff\\">
|
<div class="d2h-file-side-diff">
|
||||||
<div class=\\"d2h-code-wrapper\\">
|
<div class="d2h-code-wrapper">
|
||||||
<table class=\\"d2h-diff-table\\">
|
<table class="d2h-diff-table">
|
||||||
<tbody class=\\"d2h-diff-tbody\\">
|
<tbody class="d2h-diff-tbody">
|
||||||
<tr>
|
<tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-info\\"></td>
|
<td class="d2h-code-side-linenumber d2h-info"></td>
|
||||||
<td class=\\"d2h-info\\">
|
<td class="d2h-info">
|
||||||
<div class=\\"d2h-code-side-line d2h-info\\"></div>
|
<div class="d2h-code-side-line"> </div>
|
||||||
</td>
|
</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-ins d2h-change\\">
|
<td class="d2h-code-side-linenumber d2h-ins d2h-change">
|
||||||
1
|
1
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins d2h-change\\">
|
<td class="d2h-ins d2h-change">
|
||||||
<div class=\\"d2h-code-side-line d2h-ins d2h-change\\">
|
<div class="d2h-code-side-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"><ins>test1r</ins></span>
|
<span class="d2h-code-line-ctn"><ins>test1r</ins></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
@ -359,23 +363,27 @@ describe('SideBySideRenderer', () => {
|
||||||
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {});
|
const sideBySideRenderer = new SideBySideRenderer(hoganUtils, {});
|
||||||
const html = sideBySideRenderer.render(exampleJson);
|
const html = sideBySideRenderer.render(exampleJson);
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
"<div class=\\"d2h-wrapper\\">
|
"<div class="d2h-wrapper d2h-light-color-scheme">
|
||||||
<div id=\\"d2h-675094\\" class=\\"d2h-file-wrapper\\" data-lang=\\"js\\">
|
<div id="d2h-675094" class="d2h-file-wrapper" data-lang="js">
|
||||||
<div class=\\"d2h-file-header\\">
|
<div class="d2h-file-header">
|
||||||
<span class=\\"d2h-file-name-wrapper\\">
|
<span class="d2h-file-name-wrapper">
|
||||||
<svg aria-hidden=\\"true\\" class=\\"d2h-icon\\" height=\\"16\\" version=\\"1.1\\" viewBox=\\"0 0 12 16\\" width=\\"12\\">
|
<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>
|
<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>
|
</svg> <span class="d2h-file-name">sample</span>
|
||||||
<span class=\\"d2h-tag d2h-changed d2h-changed-tag\\">CHANGED</span></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>
|
||||||
<div class=\\"d2h-files-diff\\">
|
<div class="d2h-files-diff">
|
||||||
<div class=\\"d2h-file-side-diff\\">
|
<div class="d2h-file-side-diff">
|
||||||
<div class=\\"d2h-code-wrapper\\">
|
<div class="d2h-code-wrapper">
|
||||||
<table class=\\"d2h-diff-table\\">
|
<table class="d2h-diff-table">
|
||||||
<tbody class=\\"d2h-diff-tbody\\">
|
<tbody class="d2h-diff-tbody">
|
||||||
<tr>
|
<tr>
|
||||||
<td class=\\"d2h-info\\">
|
<td class="d2h-info">
|
||||||
<div class=\\"d2h-code-side-line d2h-info\\">
|
<div class="d2h-code-side-line">
|
||||||
File without changes
|
File without changes
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
@ -384,10 +392,10 @@ describe('SideBySideRenderer', () => {
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class=\\"d2h-file-side-diff\\">
|
<div class="d2h-file-side-diff">
|
||||||
<div class=\\"d2h-code-wrapper\\">
|
<div class="d2h-code-wrapper">
|
||||||
<table class=\\"d2h-diff-table\\">
|
<table class="d2h-diff-table">
|
||||||
<tbody class=\\"d2h-diff-tbody\\">
|
<tbody class="d2h-diff-tbody">
|
||||||
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
@ -398,6 +406,81 @@ describe('SideBySideRenderer', () => {
|
||||||
</div>"
|
</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', () => {
|
describe('processLines', () => {
|
||||||
|
|
@ -425,26 +508,26 @@ describe('SideBySideRenderer', () => {
|
||||||
const html = sideBySideRenderer.processChangedLines(false, oldLines, newLines);
|
const html = sideBySideRenderer.processChangedLines(false, oldLines, newLines);
|
||||||
|
|
||||||
expect(html).toMatchInlineSnapshot(`
|
expect(html).toMatchInlineSnapshot(`
|
||||||
Object {
|
{
|
||||||
"left": "<tr>
|
"left": "<tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-del d2h-change\\">
|
<td class="d2h-code-side-linenumber d2h-del d2h-change">
|
||||||
1
|
1
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-del d2h-change\\">
|
<td class="d2h-del d2h-change">
|
||||||
<div class=\\"d2h-code-side-line d2h-del d2h-change\\">
|
<div class="d2h-code-side-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">-</span>
|
<span class="d2h-code-line-prefix">-</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"><del>test</del></span>
|
<span class="d2h-code-line-ctn"><del>test</del></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>",
|
</tr>",
|
||||||
"right": "<tr>
|
"right": "<tr>
|
||||||
<td class=\\"d2h-code-side-linenumber d2h-ins d2h-change\\">
|
<td class="d2h-code-side-linenumber d2h-ins d2h-change">
|
||||||
1
|
1
|
||||||
</td>
|
</td>
|
||||||
<td class=\\"d2h-ins d2h-change\\">
|
<td class="d2h-ins d2h-change">
|
||||||
<div class=\\"d2h-code-side-line d2h-ins d2h-change\\">
|
<div class="d2h-code-side-line">
|
||||||
<span class=\\"d2h-code-line-prefix\\">+</span>
|
<span class="d2h-code-line-prefix">+</span>
|
||||||
<span class=\\"d2h-code-line-ctn\\"><ins>test1r</ins></span>
|
<span class="d2h-code-line-ctn"><ins>test1r</ins></span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>",
|
</tr>",
|
||||||
|
|
|
||||||
|
|
@ -4,18 +4,18 @@ describe('Utils', () => {
|
||||||
describe('escapeForRegExp', () => {
|
describe('escapeForRegExp', () => {
|
||||||
it('should escape markdown link text', () => {
|
it('should escape markdown link text', () => {
|
||||||
const result = escapeForRegExp('[Link](https://diff2html.xyz)');
|
const result = escapeForRegExp('[Link](https://diff2html.xyz)');
|
||||||
expect(result).toEqual('\\[Link\\]\\(https:\\/\\/diff2html\\.xyz\\)');
|
expect(result).toBe('\\[Link\\]\\(https:\\/\\/diff2html\\.xyz\\)');
|
||||||
});
|
});
|
||||||
it('should escape all dangerous characters', () => {
|
it('should escape all dangerous characters', () => {
|
||||||
const result = escapeForRegExp('-[]/{}()*+?.\\^$|');
|
const result = escapeForRegExp('-[]/{}()*+?.\\^$|');
|
||||||
expect(result).toEqual('\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|');
|
expect(result).toBe('\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('unifyPath', () => {
|
describe('unifyPath', () => {
|
||||||
it('should unify windows style path', () => {
|
it('should unify windows style path', () => {
|
||||||
const result = unifyPath('\\Users\\Downloads\\diff.html');
|
const result = unifyPath('\\Users\\Downloads\\diff.html');
|
||||||
expect(result).toEqual('/Users/Downloads/diff.html');
|
expect(result).toBe('/Users/Downloads/diff.html');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,9 @@ import { escapeForRegExp } from './utils';
|
||||||
export interface DiffParserConfig {
|
export interface DiffParserConfig {
|
||||||
srcPrefix?: string;
|
srcPrefix?: string;
|
||||||
dstPrefix?: string;
|
dstPrefix?: string;
|
||||||
|
diffMaxChanges?: number;
|
||||||
|
diffMaxLineLength?: number;
|
||||||
|
diffTooBigMessage?: (fileIndex: number) => string;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getExtension(filename: string, language: string): string {
|
function getExtension(filename: string, language: string): string {
|
||||||
|
|
@ -182,12 +185,16 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create block metadata */
|
/* Create block metadata */
|
||||||
// eslint-disable-next-line
|
|
||||||
// @ts-ignore
|
|
||||||
currentBlock = {
|
currentBlock = {
|
||||||
lines: [],
|
lines: [],
|
||||||
|
// eslint-disable-next-line
|
||||||
|
// @ts-ignore
|
||||||
oldStartLine: oldLine,
|
oldStartLine: oldLine,
|
||||||
|
// eslint-disable-next-line
|
||||||
|
// @ts-ignore
|
||||||
oldStartLine2: oldLine2,
|
oldStartLine2: oldLine2,
|
||||||
|
// eslint-disable-next-line
|
||||||
|
// @ts-ignore
|
||||||
newStartLine: newLine,
|
newStartLine: newLine,
|
||||||
header: line,
|
header: line,
|
||||||
};
|
};
|
||||||
|
|
@ -265,11 +272,11 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
|
||||||
const nxtLine = diffLines[lineIndex + 1];
|
const nxtLine = diffLines[lineIndex + 1];
|
||||||
const afterNxtLine = diffLines[lineIndex + 2];
|
const afterNxtLine = diffLines[lineIndex + 2];
|
||||||
|
|
||||||
if (line.startsWith('diff')) {
|
if (line.startsWith('diff --git') || line.startsWith('diff --combined')) {
|
||||||
startFile();
|
startFile();
|
||||||
|
|
||||||
// diff --git a/blocked_delta_results.png b/blocked_delta_results.png
|
// diff --git a/blocked_delta_results.png b/blocked_delta_results.png
|
||||||
const gitDiffStart = /^diff --git "?(.+)"? "?(.+)"?/;
|
const gitDiffStart = /^diff --git "?([a-ciow]\/.+)"? "?([a-ciow]\/.+)"?/;
|
||||||
if ((values = gitDiffStart.exec(line))) {
|
if ((values = gitDiffStart.exec(line))) {
|
||||||
possibleOldName = getFilename(values[1], undefined, config.dstPrefix);
|
possibleOldName = getFilename(values[1], undefined, config.dstPrefix);
|
||||||
possibleNewName = getFilename(values[2], undefined, config.srcPrefix);
|
possibleNewName = getFilename(values[2], undefined, config.srcPrefix);
|
||||||
|
|
@ -283,11 +290,27 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
|
||||||
return;
|
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 (
|
if (
|
||||||
!currentFile || // If we do not have a file yet, we should crete one
|
!currentFile || // If we do not have a file yet, we should crete one
|
||||||
(!currentFile.isGitDiff &&
|
(!currentFile.isGitDiff &&
|
||||||
currentFile && // If we already have some file in progress and
|
currentFile && // If we already have some file in progress and
|
||||||
line.startsWith(oldFileNameHeader) && // If we get to an old file path header line
|
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
|
// And is followed by the new file path header line and the hunk header line
|
||||||
nxtLine.startsWith(newFileNameHeader) &&
|
nxtLine.startsWith(newFileNameHeader) &&
|
||||||
afterNxtLine.startsWith(hunkHeaderPrefix))
|
afterNxtLine.startsWith(hunkHeaderPrefix))
|
||||||
|
|
@ -295,6 +318,31 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
|
||||||
startFile();
|
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.
|
* We need to make sure that we have the three lines of the header.
|
||||||
* This avoids cases like the ones described in:
|
* This avoids cases like the ones described in:
|
||||||
|
|
@ -410,18 +458,16 @@ export function parse(diffInput: string, config: DiffParserConfig = {}): DiffFil
|
||||||
} else if ((values = index.exec(line))) {
|
} else if ((values = index.exec(line))) {
|
||||||
currentFile.checksumBefore = values[1];
|
currentFile.checksumBefore = values[1];
|
||||||
currentFile.checksumAfter = values[2];
|
currentFile.checksumAfter = values[2];
|
||||||
values[3] && (currentFile.mode = values[3]);
|
if (values[3]) currentFile.mode = values[3];
|
||||||
} else if ((values = combinedIndex.exec(line))) {
|
} else if ((values = combinedIndex.exec(line))) {
|
||||||
currentFile.checksumBefore = [values[2], values[3]];
|
currentFile.checksumBefore = [values[2], values[3]];
|
||||||
currentFile.checksumAfter = values[1];
|
currentFile.checksumAfter = values[1];
|
||||||
} else if ((values = combinedMode.exec(line))) {
|
} else if ((values = combinedMode.exec(line))) {
|
||||||
currentFile.oldMode = [values[2], values[3]];
|
currentFile.oldMode = [values[2], values[3]];
|
||||||
currentFile.newMode = values[1];
|
currentFile.newMode = values[1];
|
||||||
// eslint-disable-next-line sonarjs/no-duplicated-branches
|
|
||||||
} else if ((values = combinedNewFile.exec(line))) {
|
} else if ((values = combinedNewFile.exec(line))) {
|
||||||
currentFile.newFileMode = values[1];
|
currentFile.newFileMode = values[1];
|
||||||
currentFile.isNew = true;
|
currentFile.isNew = true;
|
||||||
// eslint-disable-next-line sonarjs/no-duplicated-branches
|
|
||||||
} else if ((values = combinedDeletedFile.exec(line))) {
|
} else if ((values = combinedDeletedFile.exec(line))) {
|
||||||
currentFile.deletedFileMode = values[1];
|
currentFile.deletedFileMode = values[1];
|
||||||
currentFile.isDeleted = true;
|
currentFile.isDeleted = true;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import * as DiffParser from './diff-parser';
|
import * as DiffParser from './diff-parser';
|
||||||
import * as fileListPrinter from './file-list-renderer';
|
import { FileListRenderer } from './file-list-renderer';
|
||||||
import LineByLineRenderer, { LineByLineRendererConfig, defaultLineByLineRendererConfig } from './line-by-line-renderer';
|
import LineByLineRenderer, { LineByLineRendererConfig, defaultLineByLineRendererConfig } from './line-by-line-renderer';
|
||||||
import SideBySideRenderer, { SideBySideRendererConfig, defaultSideBySideRendererConfig } from './side-by-side-renderer';
|
import SideBySideRenderer, { SideBySideRendererConfig, defaultSideBySideRendererConfig } from './side-by-side-renderer';
|
||||||
import { DiffFile, OutputFormatType } from './types';
|
import { DiffFile, OutputFormatType } from './types';
|
||||||
|
|
@ -32,7 +32,10 @@ export function html(diffInput: string | DiffFile[], configuration: Diff2HtmlCon
|
||||||
|
|
||||||
const hoganUtils = new HoganJsUtils(config);
|
const hoganUtils = new HoganJsUtils(config);
|
||||||
|
|
||||||
const fileList = config.drawFileList ? fileListPrinter.render(diffJson, hoganUtils) : '';
|
const { colorScheme } = config;
|
||||||
|
const fileListRendererConfig = { colorScheme };
|
||||||
|
|
||||||
|
const fileList = config.drawFileList ? new FileListRenderer(hoganUtils, fileListRendererConfig).render(diffJson) : '';
|
||||||
|
|
||||||
const diffOutput =
|
const diffOutput =
|
||||||
config.outputFormat === 'side-by-side'
|
config.outputFormat === 'side-by-side'
|
||||||
|
|
|
||||||
|
|
@ -1,33 +1,52 @@
|
||||||
import * as renderUtils from './render-utils';
|
import * as renderUtils from './render-utils';
|
||||||
import HoganJsUtils from './hoganjs-utils';
|
import HoganJsUtils from './hoganjs-utils';
|
||||||
import { DiffFile } from './types';
|
import { ColorSchemeType, DiffFile } from './types';
|
||||||
|
|
||||||
const baseTemplatesPath = 'file-summary';
|
const baseTemplatesPath = 'file-summary';
|
||||||
const iconsBaseTemplatesPath = 'icon';
|
const iconsBaseTemplatesPath = 'icon';
|
||||||
|
|
||||||
export function render(diffFiles: DiffFile[], hoganUtils: HoganJsUtils): string {
|
export interface FileListRendererConfig {
|
||||||
const files = diffFiles
|
colorScheme?: ColorSchemeType;
|
||||||
.map(file =>
|
}
|
||||||
hoganUtils.render(
|
|
||||||
baseTemplatesPath,
|
export const defaultFileListRendererConfig = {
|
||||||
'line',
|
colorScheme: renderUtils.defaultRenderConfig.colorScheme,
|
||||||
{
|
};
|
||||||
fileHtmlId: renderUtils.getHtmlId(file),
|
|
||||||
oldName: file.oldName,
|
export class FileListRenderer {
|
||||||
newName: file.newName,
|
private readonly hoganUtils: HoganJsUtils;
|
||||||
fileName: renderUtils.filenameDiff(file),
|
private readonly config: typeof defaultFileListRendererConfig;
|
||||||
deletedLines: '-' + file.deletedLines,
|
|
||||||
addedLines: '+' + file.addedLines,
|
constructor(hoganUtils: HoganJsUtils, config: FileListRendererConfig = {}) {
|
||||||
},
|
this.hoganUtils = hoganUtils;
|
||||||
{
|
this.config = { ...defaultFileListRendererConfig, ...config };
|
||||||
fileIcon: hoganUtils.template(iconsBaseTemplatesPath, renderUtils.getFileIcon(file)),
|
}
|
||||||
},
|
|
||||||
),
|
render(diffFiles: DiffFile[]): string {
|
||||||
)
|
const files = diffFiles
|
||||||
.join('\n');
|
.map(file =>
|
||||||
|
this.hoganUtils.render(
|
||||||
return hoganUtils.render(baseTemplatesPath, 'wrapper', {
|
baseTemplatesPath,
|
||||||
filesNumber: diffFiles.length,
|
'line',
|
||||||
files: files,
|
{
|
||||||
});
|
fileHtmlId: renderUtils.getHtmlId(file),
|
||||||
|
oldName: file.oldName,
|
||||||
|
newName: file.newName,
|
||||||
|
fileName: renderUtils.filenameDiff(file),
|
||||||
|
deletedLines: '-' + file.deletedLines,
|
||||||
|
addedLines: '+' + file.addedLines,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileIcon: this.hoganUtils.template(iconsBaseTemplatesPath, renderUtils.getFileIcon(file)),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.join('\n');
|
||||||
|
|
||||||
|
return this.hoganUtils.render(baseTemplatesPath, 'wrapper', {
|
||||||
|
colorScheme: renderUtils.colorSchemeToCss(this.config.colorScheme),
|
||||||
|
filesNumber: diffFiles.length,
|
||||||
|
files: files,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ export default class HoganJsUtils {
|
||||||
try {
|
try {
|
||||||
const template = this.preCompiledTemplates[templateKey];
|
const template = this.preCompiledTemplates[templateKey];
|
||||||
return template.render(params, partials, indent);
|
return template.render(params, partials, indent);
|
||||||
} catch (e) {
|
} catch (_e) {
|
||||||
throw new Error(`Could not find template to render '${templateKey}'`);
|
throw new Error(`Could not find template to render '${templateKey}'`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,10 @@ export default class LineByLineRenderer {
|
||||||
})
|
})
|
||||||
.join('\n');
|
.join('\n');
|
||||||
|
|
||||||
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', { content: diffsHtml });
|
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', {
|
||||||
|
colorScheme: renderUtils.colorSchemeToCss(this.config.colorScheme),
|
||||||
|
content: diffsHtml,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
makeFileDiffHtml(file: DiffFile, diffs: string): string {
|
makeFileDiffHtml(file: DiffFile, diffs: string): string {
|
||||||
|
|
@ -95,7 +98,7 @@ export default class LineByLineRenderer {
|
||||||
.map(block => {
|
.map(block => {
|
||||||
let lines = this.hoganUtils.render(genericTemplatesPath, 'block-header', {
|
let lines = this.hoganUtils.render(genericTemplatesPath, 'block-header', {
|
||||||
CSSLineClass: renderUtils.CSSLineClass,
|
CSSLineClass: renderUtils.CSSLineClass,
|
||||||
blockHeader: block.header,
|
blockHeader: file.isTooBig ? block.header : renderUtils.escapeForHtml(block.header),
|
||||||
lineClass: 'd2h-code-linenumber',
|
lineClass: 'd2h-code-linenumber',
|
||||||
contentClass: 'd2h-code-line',
|
contentClass: 'd2h-code-line',
|
||||||
});
|
});
|
||||||
|
|
@ -103,14 +106,14 @@ export default class LineByLineRenderer {
|
||||||
this.applyLineGroupping(block).forEach(([contextLines, oldLines, newLines]) => {
|
this.applyLineGroupping(block).forEach(([contextLines, oldLines, newLines]) => {
|
||||||
if (oldLines.length && newLines.length && !contextLines.length) {
|
if (oldLines.length && newLines.length && !contextLines.length) {
|
||||||
this.applyRematchMatching(oldLines, newLines, matcher).map(([oldLines, newLines]) => {
|
this.applyRematchMatching(oldLines, newLines, matcher).map(([oldLines, newLines]) => {
|
||||||
const { left, right } = this.processChangedLines(file.isCombined, oldLines, newLines);
|
const { left, right } = this.processChangedLines(file, file.isCombined, oldLines, newLines);
|
||||||
lines += left;
|
lines += left;
|
||||||
lines += right;
|
lines += right;
|
||||||
});
|
});
|
||||||
} else if (contextLines.length) {
|
} else if (contextLines.length) {
|
||||||
contextLines.forEach(line => {
|
contextLines.forEach(line => {
|
||||||
const { prefix, content } = renderUtils.deconstructLine(line.content, file.isCombined);
|
const { prefix, content } = renderUtils.deconstructLine(line.content, file.isCombined);
|
||||||
lines += this.generateSingleLineHtml({
|
lines += this.generateSingleLineHtml(file, {
|
||||||
type: renderUtils.CSSLineClass.CONTEXT,
|
type: renderUtils.CSSLineClass.CONTEXT,
|
||||||
prefix: prefix,
|
prefix: prefix,
|
||||||
content: content,
|
content: content,
|
||||||
|
|
@ -119,7 +122,7 @@ export default class LineByLineRenderer {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} else if (oldLines.length || newLines.length) {
|
} else if (oldLines.length || newLines.length) {
|
||||||
const { left, right } = this.processChangedLines(file.isCombined, oldLines, newLines);
|
const { left, right } = this.processChangedLines(file, file.isCombined, oldLines, newLines);
|
||||||
lines += left;
|
lines += left;
|
||||||
lines += right;
|
lines += right;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -188,7 +191,7 @@ export default class LineByLineRenderer {
|
||||||
return doMatching ? matcher(oldLines, newLines) : [[oldLines, newLines]];
|
return doMatching ? matcher(oldLines, newLines) : [[oldLines, newLines]];
|
||||||
}
|
}
|
||||||
|
|
||||||
processChangedLines(isCombined: boolean, oldLines: DiffLine[], newLines: DiffLine[]): FileHtml {
|
processChangedLines(file: DiffFile, isCombined: boolean, oldLines: DiffLine[], newLines: DiffLine[]): FileHtml {
|
||||||
const fileHtml = {
|
const fileHtml = {
|
||||||
right: '',
|
right: '',
|
||||||
left: '',
|
left: '',
|
||||||
|
|
@ -240,7 +243,7 @@ export default class LineByLineRenderer {
|
||||||
}
|
}
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
||||||
const { left, right } = this.generateLineHtml(preparedOldLine, preparedNewLine);
|
const { left, right } = this.generateLineHtml(file, preparedOldLine, preparedNewLine);
|
||||||
fileHtml.left += left;
|
fileHtml.left += left;
|
||||||
fileHtml.right += right;
|
fileHtml.right += right;
|
||||||
}
|
}
|
||||||
|
|
@ -248,14 +251,14 @@ export default class LineByLineRenderer {
|
||||||
return fileHtml;
|
return fileHtml;
|
||||||
}
|
}
|
||||||
|
|
||||||
generateLineHtml(oldLine?: DiffPreparedLine, newLine?: DiffPreparedLine): FileHtml {
|
generateLineHtml(file: DiffFile, oldLine?: DiffPreparedLine, newLine?: DiffPreparedLine): FileHtml {
|
||||||
return {
|
return {
|
||||||
left: this.generateSingleLineHtml(oldLine),
|
left: this.generateSingleLineHtml(file, oldLine),
|
||||||
right: this.generateSingleLineHtml(newLine),
|
right: this.generateSingleLineHtml(file, newLine),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
generateSingleLineHtml(line?: DiffPreparedLine): string {
|
generateSingleLineHtml(file: DiffFile, line?: DiffPreparedLine): string {
|
||||||
if (line === undefined) return '';
|
if (line === undefined) return '';
|
||||||
|
|
||||||
const lineNumberHtml = this.hoganUtils.render(baseTemplatesPath, 'numbers', {
|
const lineNumberHtml = this.hoganUtils.render(baseTemplatesPath, 'numbers', {
|
||||||
|
|
@ -270,6 +273,8 @@ export default class LineByLineRenderer {
|
||||||
prefix: line.prefix === ' ' ? ' ' : line.prefix,
|
prefix: line.prefix === ' ' ? ' ' : line.prefix,
|
||||||
content: line.content,
|
content: line.content,
|
||||||
lineNumber: lineNumberHtml,
|
lineNumber: lineNumberHtml,
|
||||||
|
line,
|
||||||
|
file,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,15 @@ import * as jsDiff from 'diff';
|
||||||
|
|
||||||
import { unifyPath, hashCode } from './utils';
|
import { unifyPath, hashCode } from './utils';
|
||||||
import * as rematch from './rematch';
|
import * as rematch from './rematch';
|
||||||
import { LineMatchingType, DiffStyleType, LineType, DiffLineParts, DiffFile, DiffFileName } from './types';
|
import {
|
||||||
|
ColorSchemeType,
|
||||||
|
DiffFile,
|
||||||
|
DiffFileName,
|
||||||
|
DiffLineParts,
|
||||||
|
DiffStyleType,
|
||||||
|
LineMatchingType,
|
||||||
|
LineType,
|
||||||
|
} from './types';
|
||||||
|
|
||||||
export type CSSLineClass =
|
export type CSSLineClass =
|
||||||
| 'd2h-ins'
|
| 'd2h-ins'
|
||||||
|
|
@ -37,6 +45,7 @@ export interface RenderConfig {
|
||||||
matchWordsThreshold?: number;
|
matchWordsThreshold?: number;
|
||||||
maxLineLengthHighlight?: number;
|
maxLineLengthHighlight?: number;
|
||||||
diffStyle?: DiffStyleType;
|
diffStyle?: DiffStyleType;
|
||||||
|
colorScheme?: ColorSchemeType;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const defaultRenderConfig = {
|
export const defaultRenderConfig = {
|
||||||
|
|
@ -44,6 +53,7 @@ export const defaultRenderConfig = {
|
||||||
matchWordsThreshold: 0.25,
|
matchWordsThreshold: 0.25,
|
||||||
maxLineLengthHighlight: 10000,
|
maxLineLengthHighlight: 10000,
|
||||||
diffStyle: DiffStyleType.WORD,
|
diffStyle: DiffStyleType.WORD,
|
||||||
|
colorScheme: ColorSchemeType.LIGHT,
|
||||||
};
|
};
|
||||||
|
|
||||||
const separator = '/';
|
const separator = '/';
|
||||||
|
|
@ -76,6 +86,18 @@ export function toCSSClass(lineType: LineType): CSSLineClass {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function colorSchemeToCss(colorScheme: ColorSchemeType): string {
|
||||||
|
switch (colorScheme) {
|
||||||
|
case ColorSchemeType.DARK:
|
||||||
|
return 'd2h-dark-color-scheme';
|
||||||
|
case ColorSchemeType.AUTO:
|
||||||
|
return 'd2h-auto-color-scheme';
|
||||||
|
case ColorSchemeType.LIGHT:
|
||||||
|
default:
|
||||||
|
return 'd2h-light-color-scheme';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prefix length of the hunk lines in the diff
|
* Prefix length of the hunk lines in the diff
|
||||||
*/
|
*/
|
||||||
|
|
@ -186,9 +208,7 @@ export function filenameDiff(file: DiffFileName): string {
|
||||||
* Generates a unique string numerical identifier based on the names of the file diff
|
* Generates a unique string numerical identifier based on the names of the file diff
|
||||||
*/
|
*/
|
||||||
export function getHtmlId(file: DiffFileName): string {
|
export function getHtmlId(file: DiffFileName): string {
|
||||||
return `d2h-${hashCode(filenameDiff(file))
|
return `d2h-${hashCode(filenameDiff(file)).toString().slice(-6)}`;
|
||||||
.toString()
|
|
||||||
.slice(-6)}`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -231,11 +251,11 @@ export function diffHighlight(
|
||||||
return {
|
return {
|
||||||
oldLine: {
|
oldLine: {
|
||||||
prefix: line1.prefix,
|
prefix: line1.prefix,
|
||||||
content: line1.content,
|
content: escapeForHtml(line1.content),
|
||||||
},
|
},
|
||||||
newLine: {
|
newLine: {
|
||||||
prefix: line2.prefix,
|
prefix: line2.prefix,
|
||||||
content: line2.content,
|
content: escapeForHtml(line2.content),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,10 @@ export default class SideBySideRenderer {
|
||||||
})
|
})
|
||||||
.join('\n');
|
.join('\n');
|
||||||
|
|
||||||
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', { content: diffsHtml });
|
return this.hoganUtils.render(genericTemplatesPath, 'wrapper', {
|
||||||
|
colorScheme: renderUtils.colorSchemeToCss(this.config.colorScheme),
|
||||||
|
content: diffsHtml,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
makeFileDiffHtml(file: DiffFile, diffs: FileHtml): string {
|
makeFileDiffHtml(file: DiffFile, diffs: FileHtml): string {
|
||||||
|
|
@ -97,7 +100,7 @@ export default class SideBySideRenderer {
|
||||||
return file.blocks
|
return file.blocks
|
||||||
.map(block => {
|
.map(block => {
|
||||||
const fileHtml = {
|
const fileHtml = {
|
||||||
left: this.makeHeaderHtml(block.header),
|
left: this.makeHeaderHtml(block.header, file),
|
||||||
right: this.makeHeaderHtml(''),
|
right: this.makeHeaderHtml(''),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -203,10 +206,10 @@ export default class SideBySideRenderer {
|
||||||
return doMatching ? matcher(oldLines, newLines) : [[oldLines, newLines]];
|
return doMatching ? matcher(oldLines, newLines) : [[oldLines, newLines]];
|
||||||
}
|
}
|
||||||
|
|
||||||
makeHeaderHtml(blockHeader: string): string {
|
makeHeaderHtml(blockHeader: string, file?: DiffFile): string {
|
||||||
return this.hoganUtils.render(genericTemplatesPath, 'block-header', {
|
return this.hoganUtils.render(genericTemplatesPath, 'block-header', {
|
||||||
CSSLineClass: renderUtils.CSSLineClass,
|
CSSLineClass: renderUtils.CSSLineClass,
|
||||||
blockHeader: blockHeader,
|
blockHeader: file?.isTooBig ? blockHeader : renderUtils.escapeForHtml(blockHeader),
|
||||||
lineClass: 'd2h-code-side-linenumber',
|
lineClass: 'd2h-code-side-linenumber',
|
||||||
contentClass: 'd2h-code-side-line',
|
contentClass: 'd2h-code-side-line',
|
||||||
});
|
});
|
||||||
|
|
@ -285,8 +288,8 @@ export default class SideBySideRenderer {
|
||||||
type: line?.type || `${renderUtils.CSSLineClass.CONTEXT} d2h-emptyplaceholder`,
|
type: line?.type || `${renderUtils.CSSLineClass.CONTEXT} d2h-emptyplaceholder`,
|
||||||
lineClass: line !== undefined ? lineClass : `${lineClass} d2h-code-side-emptyplaceholder`,
|
lineClass: line !== undefined ? lineClass : `${lineClass} d2h-code-side-emptyplaceholder`,
|
||||||
contentClass: line !== undefined ? contentClass : `${contentClass} d2h-code-side-emptyplaceholder`,
|
contentClass: line !== undefined ? contentClass : `${contentClass} d2h-code-side-emptyplaceholder`,
|
||||||
prefix: line?.prefix === ' ' ? ' ' : line?.prefix || ' ',
|
prefix: line?.prefix === ' ' ? ' ' : line?.prefix,
|
||||||
content: line?.content || ' ',
|
content: line?.content,
|
||||||
lineNumber: line?.number,
|
lineNumber: line?.number,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<div class="d2h-file-list-wrapper">
|
<div class="d2h-file-list-wrapper {{colorScheme}}">
|
||||||
<div class="d2h-file-list-header">
|
<div class="d2h-file-list-header">
|
||||||
<span class="d2h-file-list-title">Files changed ({{filesNumber}})</span>
|
<span class="d2h-file-list-title">Files changed ({{filesNumber}})</span>
|
||||||
<a class="d2h-file-switch d2h-hide">hide</a>
|
<a class="d2h-file-switch d2h-hide">hide</a>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="{{lineClass}} {{CSSLineClass.INFO}}"></td>
|
<td class="{{lineClass}} {{CSSLineClass.INFO}}"></td>
|
||||||
<td class="{{CSSLineClass.INFO}}">
|
<td class="{{CSSLineClass.INFO}}">
|
||||||
<div class="{{contentClass}} {{CSSLineClass.INFO}}">{{{blockHeader}}}</div>
|
<div class="{{contentClass}}">{{#blockHeader}}{{{blockHeader}}}{{/blockHeader}}{{^blockHeader}} {{/blockHeader}}</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="{{CSSLineClass.INFO}}">
|
<td class="{{CSSLineClass.INFO}}">
|
||||||
<div class="{{contentClass}} {{CSSLineClass.INFO}}">
|
<div class="{{contentClass}}">
|
||||||
File without changes
|
File without changes
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
||||||
|
|
@ -3,3 +3,7 @@
|
||||||
<span class="d2h-file-name">{{fileDiffName}}</span>
|
<span class="d2h-file-name">{{fileDiffName}}</span>
|
||||||
{{>fileTag}}
|
{{>fileTag}}
|
||||||
</span>
|
</span>
|
||||||
|
<label class="d2h-file-collapse">
|
||||||
|
<input class="d2h-file-collapse-input" type="checkbox" name="viewed" value="viewed">
|
||||||
|
Viewed
|
||||||
|
</label>
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,19 @@
|
||||||
{{{lineNumber}}}
|
{{{lineNumber}}}
|
||||||
</td>
|
</td>
|
||||||
<td class="{{type}}">
|
<td class="{{type}}">
|
||||||
<div class="{{contentClass}} {{type}}">
|
<div class="{{contentClass}}">
|
||||||
{{#prefix}}
|
{{#prefix}}
|
||||||
<span class="d2h-code-line-prefix">{{{prefix}}}</span>
|
<span class="d2h-code-line-prefix">{{{prefix}}}</span>
|
||||||
{{/prefix}}
|
{{/prefix}}
|
||||||
|
{{^prefix}}
|
||||||
|
<span class="d2h-code-line-prefix"> </span>
|
||||||
|
{{/prefix}}
|
||||||
{{#content}}
|
{{#content}}
|
||||||
<span class="d2h-code-line-ctn">{{{content}}}</span>
|
<span class="d2h-code-line-ctn">{{{content}}}</span>
|
||||||
{{/content}}
|
{{/content}}
|
||||||
|
{{^content}}
|
||||||
|
<span class="d2h-code-line-ctn"><br></span>
|
||||||
|
{{/content}}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
<div class="d2h-wrapper">
|
<div class="d2h-wrapper {{colorScheme}}">
|
||||||
{{{content}}}
|
{{{content}}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ export interface DiffFile extends DiffFileName {
|
||||||
isCopy?: boolean;
|
isCopy?: boolean;
|
||||||
isRename?: boolean;
|
isRename?: boolean;
|
||||||
isBinary?: boolean;
|
isBinary?: boolean;
|
||||||
|
isTooBig?: boolean;
|
||||||
unchangedPercentage?: number;
|
unchangedPercentage?: number;
|
||||||
changedPercentage?: number;
|
changedPercentage?: number;
|
||||||
checksumBefore?: string | string[];
|
checksumBefore?: string | string[];
|
||||||
|
|
@ -90,3 +91,9 @@ export const DiffStyleType: { [_: string]: DiffStyleType } = {
|
||||||
WORD: 'word',
|
WORD: 'word',
|
||||||
CHAR: 'char',
|
CHAR: 'char',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export enum ColorSchemeType {
|
||||||
|
AUTO = 'auto',
|
||||||
|
DARK = 'dark',
|
||||||
|
LIGHT = 'light',
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,15 +5,99 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
:root,
|
||||||
|
:host {
|
||||||
|
--d2h-bg-color: #fff;
|
||||||
|
--d2h-border-color: #ddd;
|
||||||
|
|
||||||
|
--d2h-dim-color: rgba(0, 0, 0, 0.3);
|
||||||
|
|
||||||
|
--d2h-line-border-color: #eeeeee;
|
||||||
|
|
||||||
|
--d2h-file-header-bg-color: #f7f7f7;
|
||||||
|
--d2h-file-header-border-color: #d8d8d8;
|
||||||
|
|
||||||
|
--d2h-empty-placeholder-bg-color: #f1f1f1;
|
||||||
|
--d2h-empty-placeholder-border-color: #e1e1e1;
|
||||||
|
|
||||||
|
--d2h-selected-color: #c8e1ff;
|
||||||
|
|
||||||
|
--d2h-ins-bg-color: #dfd;
|
||||||
|
--d2h-ins-border-color: #b4e2b4;
|
||||||
|
--d2h-ins-highlight-bg-color: #97f295;
|
||||||
|
--d2h-ins-label-color: #399839;
|
||||||
|
|
||||||
|
--d2h-del-bg-color: #fee8e9;
|
||||||
|
--d2h-del-border-color: #e9aeae;
|
||||||
|
--d2h-del-highlight-bg-color: #ffb6ba;
|
||||||
|
--d2h-del-label-color: #c33;
|
||||||
|
|
||||||
|
--d2h-change-del-color: #fdf2d0;
|
||||||
|
--d2h-change-ins-color: #ded;
|
||||||
|
|
||||||
|
--d2h-info-bg-color: #f8fafd;
|
||||||
|
--d2h-info-border-color: #d5e4f2;
|
||||||
|
|
||||||
|
--d2h-change-label-color: #d0b44c;
|
||||||
|
--d2h-moved-label-color: #3572b0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dark Color Scheme
|
||||||
|
*/
|
||||||
|
|
||||||
|
--d2h-dark-color: rgb(230, 237, 243);
|
||||||
|
--d2h-dark-bg-color: rgb(13, 17, 23);
|
||||||
|
--d2h-dark-border-color: rgb(48, 54, 61);
|
||||||
|
|
||||||
|
--d2h-dark-dim-color: rgb(110, 118, 129);
|
||||||
|
|
||||||
|
--d2h-dark-line-border-color: rgb(33, 38, 45);
|
||||||
|
|
||||||
|
--d2h-dark-file-header-bg-color: rgb(22, 27, 34);
|
||||||
|
--d2h-dark-file-header-border-color: rgb(48, 54, 61);
|
||||||
|
|
||||||
|
--d2h-dark-empty-placeholder-bg-color: rgba(110, 118, 129, 0.1);
|
||||||
|
--d2h-dark-empty-placeholder-border-color: rgb(48, 54, 61);
|
||||||
|
|
||||||
|
--d2h-dark-selected-color: rgba(56, 139, 253, 0.1);
|
||||||
|
|
||||||
|
--d2h-dark-ins-bg-color: rgba(46, 160, 67, 0.15);
|
||||||
|
--d2h-dark-ins-border-color: rgba(46, 160, 67, 0.4);
|
||||||
|
--d2h-dark-ins-highlight-bg-color: rgba(46, 160, 67, 0.4);
|
||||||
|
--d2h-dark-ins-label-color: rgb(63, 185, 80);
|
||||||
|
|
||||||
|
--d2h-dark-del-bg-color: rgba(248, 81, 73, 0.1);
|
||||||
|
--d2h-dark-del-border-color: rgba(248, 81, 73, 0.4);
|
||||||
|
--d2h-dark-del-highlight-bg-color: rgba(248, 81, 73, 0.4);
|
||||||
|
--d2h-dark-del-label-color: rgb(248, 81, 73);
|
||||||
|
|
||||||
|
--d2h-dark-change-del-color: rgba(210, 153, 34, 0.2);
|
||||||
|
--d2h-dark-change-ins-color: rgba(46, 160, 67, 0.25);
|
||||||
|
|
||||||
|
--d2h-dark-info-bg-color: rgba(56, 139, 253, 0.1);
|
||||||
|
--d2h-dark-info-border-color: rgba(56, 139, 253, 0.4);
|
||||||
|
|
||||||
|
--d2h-dark-change-label-color: rgb(210, 153, 34);
|
||||||
|
--d2h-dark-moved-label-color: #3572b0;
|
||||||
|
}
|
||||||
|
|
||||||
.d2h-wrapper {
|
.d2h-wrapper {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-header {
|
.d2h-file-header {
|
||||||
|
display: flex;
|
||||||
height: 35px;
|
height: 35px;
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
border-bottom: 1px solid #d8d8d8;
|
border-bottom: 1px solid var(--d2h-file-header-border-color);
|
||||||
background-color: #f7f7f7;
|
background-color: var(--d2h-file-header-bg-color);
|
||||||
|
font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-file-header.d2h-sticky-header {
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-stats {
|
.d2h-file-stats {
|
||||||
|
|
@ -26,18 +110,18 @@
|
||||||
|
|
||||||
.d2h-lines-added {
|
.d2h-lines-added {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
border: 1px solid #b4e2b4;
|
border: 1px solid var(--d2h-ins-border-color);
|
||||||
border-radius: 5px 0 0 5px;
|
border-radius: 5px 0 0 5px;
|
||||||
color: #399839;
|
color: var(--d2h-ins-label-color);
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-lines-deleted {
|
.d2h-lines-deleted {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
border: 1px solid #e9aeae;
|
border: 1px solid var(--d2h-del-border-color);
|
||||||
border-radius: 0 5px 5px 0;
|
border-radius: 0 5px 5px 0;
|
||||||
color: #c33;
|
color: var(--d2h-del-label-color);
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
margin-left: 1px;
|
margin-left: 1px;
|
||||||
|
|
@ -51,7 +135,6 @@
|
||||||
-ms-flex-align: center;
|
-ms-flex-align: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -62,11 +145,30 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-wrapper {
|
.d2h-file-wrapper {
|
||||||
border: 1px solid #ddd;
|
border: 1px solid var(--d2h-border-color);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
margin-bottom: 1em;
|
margin-bottom: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.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 {
|
.d2h-diff-table {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
|
|
@ -75,27 +177,31 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-files-diff {
|
.d2h-files-diff {
|
||||||
display: block;
|
display: flex;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-diff {
|
.d2h-file-diff {
|
||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.d2h-files-diff.d2h-d-none,
|
||||||
|
.d2h-file-diff.d2h-d-none {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
.d2h-file-side-diff {
|
.d2h-file-side-diff {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
overflow-x: scroll;
|
overflow-x: scroll;
|
||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
width: 50%;
|
width: 50%;
|
||||||
margin-right: -4px;
|
|
||||||
margin-bottom: -8px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-code-line {
|
.d2h-code-line {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
user-select: none;
|
||||||
|
width: calc(100% - 16em);
|
||||||
/* Compensate for the absolute positioning of the line numbers */
|
/* Compensate for the absolute positioning of the line numbers */
|
||||||
padding: 0 8em;
|
padding: 0 8em;
|
||||||
}
|
}
|
||||||
|
|
@ -103,16 +209,29 @@
|
||||||
.d2h-code-side-line {
|
.d2h-code-side-line {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
user-select: none;
|
||||||
|
width: calc(100% - 9em);
|
||||||
/* Compensate for the absolute positioning of the line numbers */
|
/* Compensate for the absolute positioning of the line numbers */
|
||||||
padding: 0 4.5em;
|
padding: 0 4.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.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-line del,
|
||||||
.d2h-code-side-line del {
|
.d2h-code-side-line del {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-top: -1px;
|
margin-top: -1px;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
background-color: #ffb6ba;
|
background-color: var(--d2h-del-highlight-bg-color);
|
||||||
border-radius: 0.2em;
|
border-radius: 0.2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -121,7 +240,7 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin-top: -1px;
|
margin-top: -1px;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
background-color: #97f295;
|
background-color: var(--d2h-ins-highlight-bg-color);
|
||||||
border-radius: 0.2em;
|
border-radius: 0.2em;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
@ -134,14 +253,6 @@
|
||||||
white-space: pre;
|
white-space: pre;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-code-line-ctn {
|
|
||||||
display: inline;
|
|
||||||
background: none;
|
|
||||||
padding: 0;
|
|
||||||
word-wrap: normal;
|
|
||||||
white-space: pre;
|
|
||||||
}
|
|
||||||
|
|
||||||
.line-num1 {
|
.line-num1 {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
float: left;
|
float: left;
|
||||||
|
|
@ -166,10 +277,10 @@
|
||||||
/* Keep the numbers fixed on line contents scroll */
|
/* Keep the numbers fixed on line contents scroll */
|
||||||
position: absolute;
|
position: absolute;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
background-color: #fff;
|
background-color: var(--d2h-bg-color);
|
||||||
color: rgba(0, 0, 0, 0.3);
|
color: var(--d2h-dim-color);
|
||||||
text-align: right;
|
text-align: right;
|
||||||
border: solid #eeeeee;
|
border: solid var(--d2h-line-border-color);
|
||||||
border-width: 0 1px 0 1px;
|
border-width: 0 1px 0 1px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
@ -184,14 +295,15 @@
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
width: 4em;
|
width: 4em;
|
||||||
background-color: #fff;
|
background-color: var(--d2h-bg-color);
|
||||||
color: rgba(0, 0, 0, 0.3);
|
color: var(--d2h-dim-color);
|
||||||
text-align: right;
|
text-align: right;
|
||||||
border: solid #eeeeee;
|
border: solid var(--d2h-line-border-color);
|
||||||
border-width: 0 1px 0 1px;
|
border-width: 0 1px 0 1px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
|
padding: 0 0.5em 0 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-code-side-linenumber:after {
|
.d2h-code-side-linenumber:after {
|
||||||
|
|
@ -200,8 +312,20 @@
|
||||||
|
|
||||||
.d2h-code-side-emptyplaceholder,
|
.d2h-code-side-emptyplaceholder,
|
||||||
.d2h-emptyplaceholder {
|
.d2h-emptyplaceholder {
|
||||||
background-color: #f1f1f1;
|
background-color: var(--d2h-empty-placeholder-bg-color);
|
||||||
border-color: #e1e1e1;
|
border-color: var(--d2h-empty-placeholder-border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-code-linenumber,
|
||||||
|
.d2h-code-side-linenumber,
|
||||||
|
.d2h-code-line-prefix,
|
||||||
|
.d2h-emptyplaceholder {
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-code-linenumber,
|
||||||
|
.d2h-code-side-linenumber {
|
||||||
|
direction: rtl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -209,27 +333,27 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.d2h-del {
|
.d2h-del {
|
||||||
background-color: #fee8e9;
|
background-color: var(--d2h-del-bg-color);
|
||||||
border-color: #e9aeae;
|
border-color: var(--d2h-del-border-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-ins {
|
.d2h-ins {
|
||||||
background-color: #dfd;
|
background-color: var(--d2h-ins-bg-color);
|
||||||
border-color: #b4e2b4;
|
border-color: var(--d2h-ins-border-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-info {
|
.d2h-info {
|
||||||
background-color: #f8fafd;
|
background-color: var(--d2h-info-bg-color);
|
||||||
color: rgba(0, 0, 0, 0.3);
|
color: var(--d2h-dim-color);
|
||||||
border-color: #d5e4f2;
|
border-color: var(--d2h-info-border-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-diff .d2h-del.d2h-change {
|
.d2h-file-diff .d2h-del.d2h-change {
|
||||||
background-color: #fdf2d0;
|
background-color: var(--d2h-change-del-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-diff .d2h-ins.d2h-change {
|
.d2h-file-diff .d2h-ins.d2h-change {
|
||||||
background-color: #ded;
|
background-color: var(--d2h-change-ins-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -242,11 +366,11 @@
|
||||||
|
|
||||||
.d2h-file-list-wrapper a {
|
.d2h-file-list-wrapper a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
color: #3572b0;
|
color: var(--d2h-moved-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-list-wrapper a:visited {
|
.d2h-file-list-wrapper a:visited {
|
||||||
color: #3572b0;
|
color: var(--d2h-moved-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-list-header {
|
.d2h-file-list-header {
|
||||||
|
|
@ -272,7 +396,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-file-list > li {
|
.d2h-file-list > li {
|
||||||
border-bottom: #ddd solid 1px;
|
border-bottom: var(--d2h-border-color) solid 1px;
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
@ -294,19 +418,19 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-deleted {
|
.d2h-deleted {
|
||||||
color: #c33;
|
color: var(--d2h-del-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-added {
|
.d2h-added {
|
||||||
color: #399839;
|
color: var(--d2h-ins-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-changed {
|
.d2h-changed {
|
||||||
color: #d0b44c;
|
color: var(--d2h-change-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-moved {
|
.d2h-moved {
|
||||||
color: #3572b0;
|
color: var(--d2h-moved-label-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-tag {
|
.d2h-tag {
|
||||||
|
|
@ -316,60 +440,302 @@
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
padding: 0 2px;
|
padding: 0 2px;
|
||||||
background-color: #fff;
|
background-color: var(--d2h-bg-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-deleted-tag {
|
.d2h-deleted-tag {
|
||||||
border: #c33 1px solid;
|
border: var(--d2h-del-label-color) 1px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-added-tag {
|
.d2h-added-tag {
|
||||||
border: #399839 1px solid;
|
border: var(--d2h-ins-label-color) 1px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-changed-tag {
|
.d2h-changed-tag {
|
||||||
border: #d0b44c 1px solid;
|
border: var(--d2h-change-label-color) 1px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.d2h-moved-tag {
|
.d2h-moved-tag {
|
||||||
border: #3572b0 1px solid;
|
border: var(--d2h-moved-label-color) 1px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Selection util.
|
* Dark Mode Colors
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.selecting-left .d2h-code-line,
|
.d2h-dark-color-scheme {
|
||||||
.selecting-left .d2h-code-line *,
|
color: var(--d2h-dark-color);
|
||||||
.selecting-right td.d2h-code-linenumber,
|
background-color: var(--d2h-dark-bg-color);
|
||||||
.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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.selecting-left .d2h-code-line::-moz-selection,
|
.d2h-dark-color-scheme .d2h-file-header {
|
||||||
.selecting-left .d2h-code-line *::-moz-selection,
|
background-color: var(--d2h-dark-file-header-bg-color);
|
||||||
.selecting-right td.d2h-code-linenumber::-moz-selection,
|
border-bottom: var(--d2h-dark-file-header-border-color);
|
||||||
.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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.selecting-left .d2h-code-line::selection,
|
.d2h-dark-color-scheme .d2h-lines-added {
|
||||||
.selecting-left .d2h-code-line *::selection,
|
border: 1px solid var(--d2h-dark-ins-border-color);
|
||||||
.selecting-right td.d2h-code-linenumber::selection,
|
color: var(--d2h-dark-ins-label-color);
|
||||||
.selecting-left .d2h-code-side-line::selection,
|
}
|
||||||
.selecting-left .d2h-code-side-line *::selection,
|
|
||||||
.selecting-right td.d2h-code-side-linenumber::selection,
|
.d2h-dark-color-scheme .d2h-lines-deleted {
|
||||||
.selecting-right td.d2h-code-side-linenumber *::selection {
|
border: 1px solid var(--d2h-dark-del-border-color);
|
||||||
background: transparent;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,22 @@
|
||||||
import * as HighlightJS from 'highlight.js/lib/highlight.js';
|
import { closeTags, nodeStream, mergeStreams, getLanguage } from './highlight.js-helpers';
|
||||||
import { ICompiledMode, IHighlightResult, IAutoHighlightResult } from 'highlight.js';
|
|
||||||
import { nodeStream, mergeStreams } from './highlight.js-helpers';
|
|
||||||
|
|
||||||
import { html, Diff2HtmlConfig, defaultDiff2HtmlConfig } from '../../diff2html';
|
import { html, Diff2HtmlConfig, defaultDiff2HtmlConfig } from '../../diff2html';
|
||||||
import { DiffFile } from '../../types';
|
import { DiffFile } from '../../types';
|
||||||
|
import { HighlightResult, HLJSApi } from 'highlight.js';
|
||||||
|
|
||||||
export interface Diff2HtmlUIConfig extends Diff2HtmlConfig {
|
export interface Diff2HtmlUIConfig extends Diff2HtmlConfig {
|
||||||
synchronisedScroll?: boolean;
|
synchronisedScroll?: boolean;
|
||||||
highlight?: boolean;
|
highlight?: boolean;
|
||||||
fileListToggle?: boolean;
|
fileListToggle?: boolean;
|
||||||
fileListStartVisible?: 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;
|
smartSelection?: boolean;
|
||||||
|
fileContentToggle?: boolean;
|
||||||
|
stickyFileHeaders?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const defaultDiff2HtmlUIConfig = {
|
export const defaultDiff2HtmlUIConfig = {
|
||||||
|
|
@ -19,23 +25,25 @@ export const defaultDiff2HtmlUIConfig = {
|
||||||
highlight: true,
|
highlight: true,
|
||||||
fileListToggle: true,
|
fileListToggle: true,
|
||||||
fileListStartVisible: false,
|
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,
|
smartSelection: true,
|
||||||
|
fileContentToggle: true,
|
||||||
|
stickyFileHeaders: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
export class Diff2HtmlUI {
|
export class Diff2HtmlUI {
|
||||||
readonly config: typeof defaultDiff2HtmlUIConfig;
|
readonly config: typeof defaultDiff2HtmlUIConfig;
|
||||||
readonly diffHtml: string;
|
readonly diffHtml: string;
|
||||||
readonly targetElement: HTMLElement;
|
readonly targetElement: HTMLElement;
|
||||||
readonly hljs: typeof HighlightJS | null = null;
|
readonly hljs: HLJSApi | null = null;
|
||||||
|
|
||||||
currentSelectionColumnId = -1;
|
currentSelectionColumnId = -1;
|
||||||
|
|
||||||
constructor(
|
constructor(target: HTMLElement, diffInput?: string | DiffFile[], config: Diff2HtmlUIConfig = {}, hljs?: HLJSApi) {
|
||||||
target: HTMLElement,
|
|
||||||
diffInput?: string | DiffFile[],
|
|
||||||
config: Diff2HtmlUIConfig = {},
|
|
||||||
hljs?: typeof HighlightJS,
|
|
||||||
) {
|
|
||||||
this.config = { ...defaultDiff2HtmlUIConfig, ...config };
|
this.config = { ...defaultDiff2HtmlUIConfig, ...config };
|
||||||
this.diffHtml = diffInput !== undefined ? html(diffInput, this.config) : target.innerHTML;
|
this.diffHtml = diffInput !== undefined ? html(diffInput, this.config) : target.innerHTML;
|
||||||
this.targetElement = target;
|
this.targetElement = target;
|
||||||
|
|
@ -44,10 +52,11 @@ export class Diff2HtmlUI {
|
||||||
|
|
||||||
draw(): void {
|
draw(): void {
|
||||||
this.targetElement.innerHTML = this.diffHtml;
|
this.targetElement.innerHTML = this.diffHtml;
|
||||||
if (this.config.smartSelection) this.smartSelection();
|
|
||||||
if (this.config.synchronisedScroll) this.synchronisedScroll();
|
if (this.config.synchronisedScroll) this.synchronisedScroll();
|
||||||
if (this.config.highlight) this.highlightCode();
|
if (this.config.highlight) this.highlightCode();
|
||||||
if (this.config.fileListToggle) this.fileListToggle(this.config.fileListStartVisible);
|
if (this.config.fileListToggle) this.fileListToggle(this.config.fileListStartVisible);
|
||||||
|
if (this.config.fileContentToggle) this.fileContentToggle();
|
||||||
|
if (this.config.stickyFileHeaders) this.stickyFileHeaders();
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronisedScroll(): void {
|
synchronisedScroll(): void {
|
||||||
|
|
@ -73,7 +82,7 @@ export class Diff2HtmlUI {
|
||||||
}
|
}
|
||||||
|
|
||||||
fileListToggle(startVisible: boolean): void {
|
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 hideBtn: HTMLElement | null = this.targetElement.querySelector('.d2h-hide');
|
||||||
const fileList: HTMLElement | null = this.targetElement.querySelector('.d2h-file-list');
|
const fileList: HTMLElement | null = this.targetElement.querySelector('.d2h-file-list');
|
||||||
|
|
||||||
|
|
@ -101,46 +110,73 @@ export class Diff2HtmlUI {
|
||||||
else hide();
|
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 {
|
highlightCode(): void {
|
||||||
if (this.hljs === null) {
|
const hljs = this.hljs;
|
||||||
|
if (hljs === null) {
|
||||||
throw new Error('Missing a `highlight.js` implementation. Please provide one when instantiating Diff2HtmlUI.');
|
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
|
// Collect all the diff files and execute the highlight on their lines
|
||||||
const files = this.targetElement.querySelectorAll('.d2h-file-wrapper');
|
const files = this.targetElement.querySelectorAll('.d2h-file-wrapper');
|
||||||
files.forEach(file => {
|
files.forEach(file => {
|
||||||
let oldLinesState: ICompiledMode;
|
const language = file.getAttribute('data-lang');
|
||||||
let newLinesState: ICompiledMode;
|
|
||||||
|
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';
|
||||||
|
}
|
||||||
|
|
||||||
// Collect all the code lines and execute the highlight on them
|
// Collect all the code lines and execute the highlight on them
|
||||||
const codeLines = file.querySelectorAll('.d2h-code-line-ctn');
|
const codeLines = file.querySelectorAll('.d2h-code-line-ctn');
|
||||||
codeLines.forEach(line => {
|
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 text = line.textContent;
|
||||||
const lineParent = line.parentNode;
|
const lineParent = line.parentNode;
|
||||||
|
|
||||||
if (text === null || lineParent === null || !this.isElement(lineParent)) return;
|
if (text === null || lineParent === null || !this.isElement(lineParent)) return;
|
||||||
|
|
||||||
const lineState = lineParent.classList.contains('d2h-del') ? oldLinesState : newLinesState;
|
const result: HighlightResult = closeTags(
|
||||||
|
hljs.highlight(text, {
|
||||||
const language = file.getAttribute('data-lang');
|
language: hljsLanguage,
|
||||||
const result =
|
ignoreIllegals: true,
|
||||||
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);
|
const originalStream = nodeStream(line);
|
||||||
if (originalStream.length) {
|
if (originalStream.length) {
|
||||||
|
|
@ -150,48 +186,25 @@ export class Diff2HtmlUI {
|
||||||
}
|
}
|
||||||
|
|
||||||
line.classList.add('hljs');
|
line.classList.add('hljs');
|
||||||
line.classList.add(result.language);
|
if (result.language) {
|
||||||
|
line.classList.add(result.language);
|
||||||
|
}
|
||||||
line.innerHTML = result.value;
|
line.innerHTML = result.value;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
smartSelection(): void {
|
stickyFileHeaders(): void {
|
||||||
const body = document.getElementsByTagName('body')[0];
|
this.targetElement.querySelectorAll('.d2h-file-header').forEach(header => {
|
||||||
const diffTable = body.getElementsByClassName('d2h-diff-table')[0];
|
header.classList.add('d2h-sticky-header');
|
||||||
|
|
||||||
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();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private instanceOfIHighlightResult(object: IHighlightResult | IAutoHighlightResult): object is IHighlightResult {
|
/**
|
||||||
return 'top' in object;
|
* @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 getHashTag(): string | null {
|
private getHashTag(): string | null {
|
||||||
|
|
@ -206,37 +219,7 @@ export class Diff2HtmlUI {
|
||||||
return hashTag;
|
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 {
|
private isElement(arg?: unknown): arg is Element {
|
||||||
return arg !== null && (arg as Element)?.classList !== undefined;
|
return arg !== null && (arg as Element)?.classList !== undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
private isClipboardEvent(arg?: unknown): arg is ClipboardEvent {
|
|
||||||
return arg !== null && (arg as ClipboardEvent)?.clipboardData !== undefined;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,5 @@ export class Diff2HtmlUI extends Diff2HtmlUIBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Diff2HtmlUIConfig, defaultDiff2HtmlUIConfig };
|
export { defaultDiff2HtmlUIConfig };
|
||||||
|
export type { Diff2HtmlUIConfig };
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,5 @@ export class Diff2HtmlUI extends Diff2HtmlUIBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Diff2HtmlUIConfig, defaultDiff2HtmlUIConfig };
|
export { defaultDiff2HtmlUIConfig };
|
||||||
|
export type { Diff2HtmlUIConfig };
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,12 @@
|
||||||
* Used to highlight selected html elements using context
|
* Used to highlight selected html elements using context
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { HighlightResult } from 'highlight.js';
|
||||||
|
|
||||||
/* Utility functions */
|
/* Utility functions */
|
||||||
|
|
||||||
function escape(value: string): string {
|
function escapeHTML(value: string): string {
|
||||||
return value
|
return value.replace(/&/gm, '&').replace(/</gm, '<').replace(/>/gm, '>');
|
||||||
.replace(/&/gm, '&')
|
|
||||||
.replace(/</gm, '<')
|
|
||||||
.replace(/>/gm, '>');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function tag(node: Node): string {
|
function tag(node: Node): string {
|
||||||
|
|
@ -97,7 +96,7 @@ export function mergeStreams(original: NodeEvent[], highlighted: NodeEvent[], va
|
||||||
}
|
}
|
||||||
|
|
||||||
result += `<${tag(node)} ${Array<Attr>()
|
result += `<${tag(node)} ${Array<Attr>()
|
||||||
.map.call(node.attributes, attr => `${attr.nodeName}="${escape(attr.value)}"`)
|
.map.call(node.attributes, attr => `${attr.nodeName}="${escapeHTML(attr.value).replace(/"/g, '"')}"`)
|
||||||
.join(' ')}>`;
|
.join(' ')}>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -111,7 +110,7 @@ export function mergeStreams(original: NodeEvent[], highlighted: NodeEvent[], va
|
||||||
|
|
||||||
while (original.length || highlighted.length) {
|
while (original.length || highlighted.length) {
|
||||||
let stream = selectStream();
|
let stream = selectStream();
|
||||||
result += escape(value.substring(processed, stream[0].offset));
|
result += escapeHTML(value.substring(processed, stream[0].offset));
|
||||||
processed = stream[0].offset;
|
processed = stream[0].offset;
|
||||||
if (stream === original) {
|
if (stream === original) {
|
||||||
/*
|
/*
|
||||||
|
|
@ -135,5 +134,522 @@ export function mergeStreams(original: NodeEvent[], highlighted: NodeEvent[], va
|
||||||
render(stream.splice(0, 1)[0]);
|
render(stream.splice(0, 1)[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result + escape(value.substr(processed));
|
|
||||||
|
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';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
// Require the highlight.js library without languages
|
// Require the highlight.js library without languages
|
||||||
import highlightJS from 'highlight.js/lib/highlight.js';
|
import highlightJS from 'highlight.js/lib/core';
|
||||||
|
|
||||||
// Convert to imports
|
// Convert to imports
|
||||||
// ^highlightJS\.registerLanguage\('(.+)', require\('highlight.js\/lib\/languages\/(.+)'\)\);$
|
// ^hljs\.registerLanguage\('(.+)', require\('\./languages\/(.+)'\)\);$
|
||||||
// import $1 from 'highlight.js/lib/languages/$2';
|
// 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 abnf from 'highlight.js/lib/languages/abnf';
|
||||||
// import accesslog from 'highlight.js/lib/languages/accesslog';
|
// import accesslog from 'highlight.js/lib/languages/accesslog';
|
||||||
// import actionscript from 'highlight.js/lib/languages/actionscript';
|
// import actionscript from 'highlight.js/lib/languages/actionscript';
|
||||||
|
|
@ -29,27 +29,28 @@ import bash from 'highlight.js/lib/languages/bash';
|
||||||
// import basic from 'highlight.js/lib/languages/basic';
|
// import basic from 'highlight.js/lib/languages/basic';
|
||||||
// import bnf from 'highlight.js/lib/languages/bnf';
|
// import bnf from 'highlight.js/lib/languages/bnf';
|
||||||
// import brainfuck from 'highlight.js/lib/languages/brainfuck';
|
// 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 cal from 'highlight.js/lib/languages/cal';
|
||||||
// import capnproto from 'highlight.js/lib/languages/capnproto';
|
// import capnproto from 'highlight.js/lib/languages/capnproto';
|
||||||
// import ceylon from 'highlight.js/lib/languages/ceylon';
|
// import ceylon from 'highlight.js/lib/languages/ceylon';
|
||||||
// import clean from 'highlight.js/lib/languages/clean';
|
// import clean from 'highlight.js/lib/languages/clean';
|
||||||
import clojure from 'highlight.js/lib/languages/clojure';
|
import clojure from 'highlight.js/lib/languages/clojure';
|
||||||
import clojureRepl from 'highlight.js/lib/languages/clojure-repl';
|
// import clojureRepl from 'highlight.js/lib/languages/clojure-repl';
|
||||||
import cmake from 'highlight.js/lib/languages/cmake';
|
// import cmake from 'highlight.js/lib/languages/cmake';
|
||||||
import coffeescript from 'highlight.js/lib/languages/coffeescript';
|
// import coffeescript from 'highlight.js/lib/languages/coffeescript';
|
||||||
// import coq from 'highlight.js/lib/languages/coq';
|
// import coq from 'highlight.js/lib/languages/coq';
|
||||||
// import cos from 'highlight.js/lib/languages/cos';
|
// import cos from 'highlight.js/lib/languages/cos';
|
||||||
// import crmsh from 'highlight.js/lib/languages/crmsh';
|
// import crmsh from 'highlight.js/lib/languages/crmsh';
|
||||||
import crystal from 'highlight.js/lib/languages/crystal';
|
import crystal from 'highlight.js/lib/languages/crystal';
|
||||||
import cs from 'highlight.js/lib/languages/cs';
|
import csharp from 'highlight.js/lib/languages/csharp';
|
||||||
import csp from 'highlight.js/lib/languages/csp';
|
import csp from 'highlight.js/lib/languages/csp';
|
||||||
import css from 'highlight.js/lib/languages/css';
|
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 markdown from 'highlight.js/lib/languages/markdown';
|
||||||
import dart from 'highlight.js/lib/languages/dart';
|
import dart from 'highlight.js/lib/languages/dart';
|
||||||
// import delphi from 'highlight.js/lib/languages/delphi';
|
// import delphi from 'highlight.js/lib/languages/delphi';
|
||||||
import diff from 'highlight.js/lib/languages/diff';
|
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 dns from 'highlight.js/lib/languages/dns';
|
||||||
import dockerfile from 'highlight.js/lib/languages/dockerfile';
|
import dockerfile from 'highlight.js/lib/languages/dockerfile';
|
||||||
// import dos from 'highlight.js/lib/languages/dos';
|
// import dos from 'highlight.js/lib/languages/dos';
|
||||||
|
|
@ -60,10 +61,10 @@ import dockerfile from 'highlight.js/lib/languages/dockerfile';
|
||||||
import elixir from 'highlight.js/lib/languages/elixir';
|
import elixir from 'highlight.js/lib/languages/elixir';
|
||||||
import elm from 'highlight.js/lib/languages/elm';
|
import elm from 'highlight.js/lib/languages/elm';
|
||||||
import ruby from 'highlight.js/lib/languages/ruby';
|
import ruby from 'highlight.js/lib/languages/ruby';
|
||||||
import erb from 'highlight.js/lib/languages/erb';
|
// import erb from 'highlight.js/lib/languages/erb';
|
||||||
import erlangRepl from 'highlight.js/lib/languages/erlang-repl';
|
// import erlangRepl from 'highlight.js/lib/languages/erlang-repl';
|
||||||
import erlang from 'highlight.js/lib/languages/erlang';
|
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 fix from 'highlight.js/lib/languages/fix';
|
||||||
// import flix from 'highlight.js/lib/languages/flix';
|
// import flix from 'highlight.js/lib/languages/flix';
|
||||||
// import fortran from 'highlight.js/lib/languages/fortran';
|
// import fortran from 'highlight.js/lib/languages/fortran';
|
||||||
|
|
@ -83,8 +84,8 @@ import handlebars from 'highlight.js/lib/languages/handlebars';
|
||||||
import haskell from 'highlight.js/lib/languages/haskell';
|
import haskell from 'highlight.js/lib/languages/haskell';
|
||||||
// import haxe from 'highlight.js/lib/languages/haxe';
|
// import haxe from 'highlight.js/lib/languages/haxe';
|
||||||
// import hsp from 'highlight.js/lib/languages/hsp';
|
// import hsp from 'highlight.js/lib/languages/hsp';
|
||||||
import htmlbars from 'highlight.js/lib/languages/htmlbars';
|
// import htmlbars from 'highlight.js/lib/languages/htmlbars';
|
||||||
import http from 'highlight.js/lib/languages/http';
|
// import http from 'highlight.js/lib/languages/http';
|
||||||
// import hy from 'highlight.js/lib/languages/hy';
|
// import hy from 'highlight.js/lib/languages/hy';
|
||||||
// import inform7 from 'highlight.js/lib/languages/inform7';
|
// import inform7 from 'highlight.js/lib/languages/inform7';
|
||||||
import ini from 'highlight.js/lib/languages/ini';
|
import ini from 'highlight.js/lib/languages/ini';
|
||||||
|
|
@ -92,24 +93,25 @@ import ini from 'highlight.js/lib/languages/ini';
|
||||||
// import isbl from 'highlight.js/lib/languages/isbl';
|
// import isbl from 'highlight.js/lib/languages/isbl';
|
||||||
import java from 'highlight.js/lib/languages/java';
|
import java from 'highlight.js/lib/languages/java';
|
||||||
import javascript from 'highlight.js/lib/languages/javascript';
|
import javascript from 'highlight.js/lib/languages/javascript';
|
||||||
// import jboss-cli from 'highlight.js/lib/languages/jboss-cli';
|
// import jbossCli from 'highlight.js/lib/languages/jboss-cli';
|
||||||
import json from 'highlight.js/lib/languages/json';
|
import json from 'highlight.js/lib/languages/json';
|
||||||
import julia from 'highlight.js/lib/languages/julia';
|
// import julia from 'highlight.js/lib/languages/julia';
|
||||||
import juliaRepl from 'highlight.js/lib/languages/julia-repl';
|
// import juliaRepl from 'highlight.js/lib/languages/julia-repl';
|
||||||
import kotlin from 'highlight.js/lib/languages/kotlin';
|
import kotlin from 'highlight.js/lib/languages/kotlin';
|
||||||
// import lasso from 'highlight.js/lib/languages/lasso';
|
// 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 ldif from 'highlight.js/lib/languages/ldif';
|
||||||
// import leaf from 'highlight.js/lib/languages/leaf';
|
// import leaf from 'highlight.js/lib/languages/leaf';
|
||||||
import less from 'highlight.js/lib/languages/less';
|
import less from 'highlight.js/lib/languages/less';
|
||||||
import lisp from 'highlight.js/lib/languages/lisp';
|
import lisp from 'highlight.js/lib/languages/lisp';
|
||||||
// import livecodeserver from 'highlight.js/lib/languages/livecodeserver';
|
// import livecodeserver from 'highlight.js/lib/languages/livecodeserver';
|
||||||
// import livescript from 'highlight.js/lib/languages/livescript';
|
// 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 lsl from 'highlight.js/lib/languages/lsl';
|
||||||
import lua from 'highlight.js/lib/languages/lua';
|
import lua from 'highlight.js/lib/languages/lua';
|
||||||
import makefile from 'highlight.js/lib/languages/makefile';
|
import makefile from 'highlight.js/lib/languages/makefile';
|
||||||
import mathematica from 'highlight.js/lib/languages/mathematica';
|
// import mathematica from 'highlight.js/lib/languages/mathematica';
|
||||||
import matlab from 'highlight.js/lib/languages/matlab';
|
// import matlab from 'highlight.js/lib/languages/matlab';
|
||||||
// import maxima from 'highlight.js/lib/languages/maxima';
|
// import maxima from 'highlight.js/lib/languages/maxima';
|
||||||
// import mel from 'highlight.js/lib/languages/mel';
|
// import mel from 'highlight.js/lib/languages/mel';
|
||||||
// import mercury from 'highlight.js/lib/languages/mercury';
|
// import mercury from 'highlight.js/lib/languages/mercury';
|
||||||
|
|
@ -121,17 +123,18 @@ import perl from 'highlight.js/lib/languages/perl';
|
||||||
// import moonscript from 'highlight.js/lib/languages/moonscript';
|
// import moonscript from 'highlight.js/lib/languages/moonscript';
|
||||||
// import n1ql from 'highlight.js/lib/languages/n1ql';
|
// import n1ql from 'highlight.js/lib/languages/n1ql';
|
||||||
import nginx from 'highlight.js/lib/languages/nginx';
|
import nginx from 'highlight.js/lib/languages/nginx';
|
||||||
// import nimrod from 'highlight.js/lib/languages/nimrod';
|
// import nim from 'highlight.js/lib/languages/nim';
|
||||||
import nix from 'highlight.js/lib/languages/nix';
|
// import nix from 'highlight.js/lib/languages/nix';
|
||||||
// import nsis from 'highlight.js/lib/languages/nsis';
|
// import nsis from 'highlight.js/lib/languages/nsis';
|
||||||
import objectivec from 'highlight.js/lib/languages/objectivec';
|
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 openscad from 'highlight.js/lib/languages/openscad';
|
||||||
// import oxygene from 'highlight.js/lib/languages/oxygene';
|
// import oxygene from 'highlight.js/lib/languages/oxygene';
|
||||||
// import parser3 from 'highlight.js/lib/languages/parser3';
|
// import parser3 from 'highlight.js/lib/languages/parser3';
|
||||||
// import pf from 'highlight.js/lib/languages/pf';
|
// import pf from 'highlight.js/lib/languages/pf';
|
||||||
import pgsql from 'highlight.js/lib/languages/pgsql';
|
import pgsql from 'highlight.js/lib/languages/pgsql';
|
||||||
import php from 'highlight.js/lib/languages/php';
|
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 plaintext from 'highlight.js/lib/languages/plaintext';
|
||||||
// import pony from 'highlight.js/lib/languages/pony';
|
// import pony from 'highlight.js/lib/languages/pony';
|
||||||
import powershell from 'highlight.js/lib/languages/powershell';
|
import powershell from 'highlight.js/lib/languages/powershell';
|
||||||
|
|
@ -140,13 +143,14 @@ import powershell from 'highlight.js/lib/languages/powershell';
|
||||||
// import prolog from 'highlight.js/lib/languages/prolog';
|
// import prolog from 'highlight.js/lib/languages/prolog';
|
||||||
import properties from 'highlight.js/lib/languages/properties';
|
import properties from 'highlight.js/lib/languages/properties';
|
||||||
import protobuf from 'highlight.js/lib/languages/protobuf';
|
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 purebasic from 'highlight.js/lib/languages/purebasic';
|
||||||
import python from 'highlight.js/lib/languages/python';
|
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 q from 'highlight.js/lib/languages/q';
|
||||||
// import qml from 'highlight.js/lib/languages/qml';
|
// import qml from 'highlight.js/lib/languages/qml';
|
||||||
import r from 'highlight.js/lib/languages/r';
|
// import r from 'highlight.js/lib/languages/r';
|
||||||
import reasonml from 'highlight.js/lib/languages/reasonml';
|
// import reasonml from 'highlight.js/lib/languages/reasonml';
|
||||||
// import rib from 'highlight.js/lib/languages/rib';
|
// import rib from 'highlight.js/lib/languages/rib';
|
||||||
// import roboconf from 'highlight.js/lib/languages/roboconf';
|
// import roboconf from 'highlight.js/lib/languages/roboconf';
|
||||||
// import routeros from 'highlight.js/lib/languages/routeros';
|
// import routeros from 'highlight.js/lib/languages/routeros';
|
||||||
|
|
@ -155,7 +159,7 @@ import reasonml from 'highlight.js/lib/languages/reasonml';
|
||||||
import rust from 'highlight.js/lib/languages/rust';
|
import rust from 'highlight.js/lib/languages/rust';
|
||||||
// import sas from 'highlight.js/lib/languages/sas';
|
// import sas from 'highlight.js/lib/languages/sas';
|
||||||
import scala from 'highlight.js/lib/languages/scala';
|
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 scilab from 'highlight.js/lib/languages/scilab';
|
||||||
import scss from 'highlight.js/lib/languages/scss';
|
import scss from 'highlight.js/lib/languages/scss';
|
||||||
import shell from 'highlight.js/lib/languages/shell';
|
import shell from 'highlight.js/lib/languages/shell';
|
||||||
|
|
@ -167,14 +171,13 @@ import sql from 'highlight.js/lib/languages/sql';
|
||||||
// import stan from 'highlight.js/lib/languages/stan';
|
// import stan from 'highlight.js/lib/languages/stan';
|
||||||
// import stata from 'highlight.js/lib/languages/stata';
|
// import stata from 'highlight.js/lib/languages/stata';
|
||||||
// import step21 from 'highlight.js/lib/languages/step21';
|
// 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 subunit from 'highlight.js/lib/languages/subunit';
|
||||||
import swift from 'highlight.js/lib/languages/swift';
|
import swift from 'highlight.js/lib/languages/swift';
|
||||||
// import taggerscript from 'highlight.js/lib/languages/taggerscript';
|
// import taggerscript from 'highlight.js/lib/languages/taggerscript';
|
||||||
import yaml from 'highlight.js/lib/languages/yaml';
|
import yaml from 'highlight.js/lib/languages/yaml';
|
||||||
// import tap from 'highlight.js/lib/languages/tap';
|
// import tap from 'highlight.js/lib/languages/tap';
|
||||||
// import tcl from 'highlight.js/lib/languages/tcl';
|
// 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 thrift from 'highlight.js/lib/languages/thrift';
|
||||||
// import tp from 'highlight.js/lib/languages/tp';
|
// import tp from 'highlight.js/lib/languages/tp';
|
||||||
// import twig from 'highlight.js/lib/languages/twig';
|
// import twig from 'highlight.js/lib/languages/twig';
|
||||||
|
|
@ -182,21 +185,21 @@ import typescript from 'highlight.js/lib/languages/typescript';
|
||||||
// import vala from 'highlight.js/lib/languages/vala';
|
// import vala from 'highlight.js/lib/languages/vala';
|
||||||
// import vbnet from 'highlight.js/lib/languages/vbnet';
|
// import vbnet from 'highlight.js/lib/languages/vbnet';
|
||||||
// import vbscript from 'highlight.js/lib/languages/vbscript';
|
// import vbscript from 'highlight.js/lib/languages/vbscript';
|
||||||
// import vbscript-html from 'highlight.js/lib/languages/vbscript-html';
|
// import vbscriptHtml from 'highlight.js/lib/languages/vbscript-html';
|
||||||
// import verilog from 'highlight.js/lib/languages/verilog';
|
// import verilog from 'highlight.js/lib/languages/verilog';
|
||||||
// import vhdl from 'highlight.js/lib/languages/vhdl';
|
// 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 x86asm from 'highlight.js/lib/languages/x86asm';
|
||||||
// import xl from 'highlight.js/lib/languages/xl';
|
// import xl from 'highlight.js/lib/languages/xl';
|
||||||
// import xquery from 'highlight.js/lib/languages/xquery';
|
// import xquery from 'highlight.js/lib/languages/xquery';
|
||||||
// import zephir from 'highlight.js/lib/languages/zephir';
|
// import zephir from 'highlight.js/lib/languages/zephir';
|
||||||
|
|
||||||
// Convert to registerLanguage
|
// Convert to registerLanguage
|
||||||
// ^highlightJS\.registerLanguage\('(.+)', require\('highlight.js\/lib\/languages\/(.+)'\)\);$
|
// ^hljs\.registerLanguage\('(.+)', require\('\./languages\/(.+)'\)\);$
|
||||||
// highlightJS.registerLanguage('$1', $1);
|
// highlightJS.registerLanguage('$1', $1);
|
||||||
|
|
||||||
// Separately require languages
|
// Separately require languages
|
||||||
// highlightJS.registerLanguage('1c', 1c);
|
// highlightJS.registerLanguage('1c', _1c);
|
||||||
// highlightJS.registerLanguage('abnf', abnf);
|
// highlightJS.registerLanguage('abnf', abnf);
|
||||||
// highlightJS.registerLanguage('accesslog', accesslog);
|
// highlightJS.registerLanguage('accesslog', accesslog);
|
||||||
// highlightJS.registerLanguage('actionscript', actionscript);
|
// highlightJS.registerLanguage('actionscript', actionscript);
|
||||||
|
|
@ -220,27 +223,28 @@ highlightJS.registerLanguage('bash', bash);
|
||||||
// highlightJS.registerLanguage('basic', basic);
|
// highlightJS.registerLanguage('basic', basic);
|
||||||
// highlightJS.registerLanguage('bnf', bnf);
|
// highlightJS.registerLanguage('bnf', bnf);
|
||||||
// highlightJS.registerLanguage('brainfuck', brainfuck);
|
// highlightJS.registerLanguage('brainfuck', brainfuck);
|
||||||
|
highlightJS.registerLanguage('c', c);
|
||||||
// highlightJS.registerLanguage('cal', cal);
|
// highlightJS.registerLanguage('cal', cal);
|
||||||
// highlightJS.registerLanguage('capnproto', capnproto);
|
// highlightJS.registerLanguage('capnproto', capnproto);
|
||||||
// highlightJS.registerLanguage('ceylon', ceylon);
|
// highlightJS.registerLanguage('ceylon', ceylon);
|
||||||
// highlightJS.registerLanguage('clean', clean);
|
// highlightJS.registerLanguage('clean', clean);
|
||||||
highlightJS.registerLanguage('clojure', clojure);
|
highlightJS.registerLanguage('clojure', clojure);
|
||||||
highlightJS.registerLanguage('clojure-repl', clojureRepl);
|
// highlightJS.registerLanguage('clojure-repl', clojureRepl);
|
||||||
highlightJS.registerLanguage('cmake', cmake);
|
// highlightJS.registerLanguage('cmake', cmake);
|
||||||
highlightJS.registerLanguage('coffeescript', coffeescript);
|
// highlightJS.registerLanguage('coffeescript', coffeescript);
|
||||||
// highlightJS.registerLanguage('coq', coq);
|
// highlightJS.registerLanguage('coq', coq);
|
||||||
// highlightJS.registerLanguage('cos', cos);
|
// highlightJS.registerLanguage('cos', cos);
|
||||||
// highlightJS.registerLanguage('crmsh', crmsh);
|
// highlightJS.registerLanguage('crmsh', crmsh);
|
||||||
highlightJS.registerLanguage('crystal', crystal);
|
highlightJS.registerLanguage('crystal', crystal);
|
||||||
highlightJS.registerLanguage('cs', cs);
|
highlightJS.registerLanguage('csharp', csharp);
|
||||||
highlightJS.registerLanguage('csp', csp);
|
highlightJS.registerLanguage('csp', csp);
|
||||||
highlightJS.registerLanguage('css', css);
|
highlightJS.registerLanguage('css', css);
|
||||||
highlightJS.registerLanguage('d', d);
|
// highlightJS.registerLanguage('d', d);
|
||||||
highlightJS.registerLanguage('markdown', markdown);
|
highlightJS.registerLanguage('markdown', markdown);
|
||||||
highlightJS.registerLanguage('dart', dart);
|
highlightJS.registerLanguage('dart', dart);
|
||||||
// highlightJS.registerLanguage('delphi', delphi);
|
// highlightJS.registerLanguage('delphi', delphi);
|
||||||
highlightJS.registerLanguage('diff', diff);
|
highlightJS.registerLanguage('diff', diff);
|
||||||
highlightJS.registerLanguage('django', django);
|
// highlightJS.registerLanguage('django', django);
|
||||||
// highlightJS.registerLanguage('dns', dns);
|
// highlightJS.registerLanguage('dns', dns);
|
||||||
highlightJS.registerLanguage('dockerfile', dockerfile);
|
highlightJS.registerLanguage('dockerfile', dockerfile);
|
||||||
// highlightJS.registerLanguage('dos', dos);
|
// highlightJS.registerLanguage('dos', dos);
|
||||||
|
|
@ -251,10 +255,10 @@ highlightJS.registerLanguage('dockerfile', dockerfile);
|
||||||
highlightJS.registerLanguage('elixir', elixir);
|
highlightJS.registerLanguage('elixir', elixir);
|
||||||
highlightJS.registerLanguage('elm', elm);
|
highlightJS.registerLanguage('elm', elm);
|
||||||
highlightJS.registerLanguage('ruby', ruby);
|
highlightJS.registerLanguage('ruby', ruby);
|
||||||
highlightJS.registerLanguage('erb', erb);
|
// highlightJS.registerLanguage('erb', erb);
|
||||||
highlightJS.registerLanguage('erlang-repl', erlangRepl);
|
// highlightJS.registerLanguage('erlang-repl', erlangRepl);
|
||||||
highlightJS.registerLanguage('erlang', erlang);
|
highlightJS.registerLanguage('erlang', erlang);
|
||||||
highlightJS.registerLanguage('excel', excel);
|
// highlightJS.registerLanguage('excel', excel);
|
||||||
// highlightJS.registerLanguage('fix', fix);
|
// highlightJS.registerLanguage('fix', fix);
|
||||||
// highlightJS.registerLanguage('flix', flix);
|
// highlightJS.registerLanguage('flix', flix);
|
||||||
// highlightJS.registerLanguage('fortran', fortran);
|
// highlightJS.registerLanguage('fortran', fortran);
|
||||||
|
|
@ -274,8 +278,8 @@ highlightJS.registerLanguage('handlebars', handlebars);
|
||||||
highlightJS.registerLanguage('haskell', haskell);
|
highlightJS.registerLanguage('haskell', haskell);
|
||||||
// highlightJS.registerLanguage('haxe', haxe);
|
// highlightJS.registerLanguage('haxe', haxe);
|
||||||
// highlightJS.registerLanguage('hsp', hsp);
|
// highlightJS.registerLanguage('hsp', hsp);
|
||||||
highlightJS.registerLanguage('htmlbars', htmlbars);
|
// highlightJS.registerLanguage('htmlbars', htmlbars);
|
||||||
highlightJS.registerLanguage('http', http);
|
// highlightJS.registerLanguage('http', http);
|
||||||
// highlightJS.registerLanguage('hy', hy);
|
// highlightJS.registerLanguage('hy', hy);
|
||||||
// highlightJS.registerLanguage('inform7', inform7);
|
// highlightJS.registerLanguage('inform7', inform7);
|
||||||
highlightJS.registerLanguage('ini', ini);
|
highlightJS.registerLanguage('ini', ini);
|
||||||
|
|
@ -283,24 +287,25 @@ highlightJS.registerLanguage('ini', ini);
|
||||||
// highlightJS.registerLanguage('isbl', isbl);
|
// highlightJS.registerLanguage('isbl', isbl);
|
||||||
highlightJS.registerLanguage('java', java);
|
highlightJS.registerLanguage('java', java);
|
||||||
highlightJS.registerLanguage('javascript', javascript);
|
highlightJS.registerLanguage('javascript', javascript);
|
||||||
// highlightJS.registerLanguage('jboss-cli', jboss-cli);
|
// highlightJS.registerLanguage('jboss-cli', jbossCli);
|
||||||
highlightJS.registerLanguage('json', json);
|
highlightJS.registerLanguage('json', json);
|
||||||
highlightJS.registerLanguage('julia', julia);
|
// highlightJS.registerLanguage('julia', julia);
|
||||||
highlightJS.registerLanguage('julia-repl', juliaRepl);
|
// highlightJS.registerLanguage('julia-repl', juliaRepl);
|
||||||
highlightJS.registerLanguage('kotlin', kotlin);
|
highlightJS.registerLanguage('kotlin', kotlin);
|
||||||
// highlightJS.registerLanguage('lasso', lasso);
|
// highlightJS.registerLanguage('lasso', lasso);
|
||||||
|
// highlightJS.registerLanguage('latex', latex);
|
||||||
// highlightJS.registerLanguage('ldif', ldif);
|
// highlightJS.registerLanguage('ldif', ldif);
|
||||||
// highlightJS.registerLanguage('leaf', leaf);
|
// highlightJS.registerLanguage('leaf', leaf);
|
||||||
highlightJS.registerLanguage('less', less);
|
highlightJS.registerLanguage('less', less);
|
||||||
highlightJS.registerLanguage('lisp', lisp);
|
highlightJS.registerLanguage('lisp', lisp);
|
||||||
// highlightJS.registerLanguage('livecodeserver', livecodeserver);
|
// highlightJS.registerLanguage('livecodeserver', livecodeserver);
|
||||||
// highlightJS.registerLanguage('livescript', livescript);
|
// highlightJS.registerLanguage('livescript', livescript);
|
||||||
highlightJS.registerLanguage('llvm', llvm);
|
// highlightJS.registerLanguage('llvm', llvm);
|
||||||
// highlightJS.registerLanguage('lsl', lsl);
|
// highlightJS.registerLanguage('lsl', lsl);
|
||||||
highlightJS.registerLanguage('lua', lua);
|
highlightJS.registerLanguage('lua', lua);
|
||||||
highlightJS.registerLanguage('makefile', makefile);
|
highlightJS.registerLanguage('makefile', makefile);
|
||||||
highlightJS.registerLanguage('mathematica', mathematica);
|
// highlightJS.registerLanguage('mathematica', mathematica);
|
||||||
highlightJS.registerLanguage('matlab', matlab);
|
// highlightJS.registerLanguage('matlab', matlab);
|
||||||
// highlightJS.registerLanguage('maxima', maxima);
|
// highlightJS.registerLanguage('maxima', maxima);
|
||||||
// highlightJS.registerLanguage('mel', mel);
|
// highlightJS.registerLanguage('mel', mel);
|
||||||
// highlightJS.registerLanguage('mercury', mercury);
|
// highlightJS.registerLanguage('mercury', mercury);
|
||||||
|
|
@ -312,17 +317,18 @@ highlightJS.registerLanguage('perl', perl);
|
||||||
// highlightJS.registerLanguage('moonscript', moonscript);
|
// highlightJS.registerLanguage('moonscript', moonscript);
|
||||||
// highlightJS.registerLanguage('n1ql', n1ql);
|
// highlightJS.registerLanguage('n1ql', n1ql);
|
||||||
highlightJS.registerLanguage('nginx', nginx);
|
highlightJS.registerLanguage('nginx', nginx);
|
||||||
// highlightJS.registerLanguage('nimrod', nimrod);
|
// highlightJS.registerLanguage('nim', nim);
|
||||||
highlightJS.registerLanguage('nix', nix);
|
// highlightJS.registerLanguage('nix', nix);
|
||||||
// highlightJS.registerLanguage('nsis', nsis);
|
// highlightJS.registerLanguage('nsis', nsis);
|
||||||
highlightJS.registerLanguage('objectivec', objectivec);
|
highlightJS.registerLanguage('objectivec', objectivec);
|
||||||
highlightJS.registerLanguage('ocaml', ocaml);
|
// highlightJS.registerLanguage('ocaml', ocaml);
|
||||||
// highlightJS.registerLanguage('openscad', openscad);
|
// highlightJS.registerLanguage('openscad', openscad);
|
||||||
// highlightJS.registerLanguage('oxygene', oxygene);
|
// highlightJS.registerLanguage('oxygene', oxygene);
|
||||||
// highlightJS.registerLanguage('parser3', parser3);
|
// highlightJS.registerLanguage('parser3', parser3);
|
||||||
// highlightJS.registerLanguage('pf', pf);
|
// highlightJS.registerLanguage('pf', pf);
|
||||||
highlightJS.registerLanguage('pgsql', pgsql);
|
highlightJS.registerLanguage('pgsql', pgsql);
|
||||||
highlightJS.registerLanguage('php', php);
|
highlightJS.registerLanguage('php', php);
|
||||||
|
// highlightJS.registerLanguage('php-template', phpTemplate);
|
||||||
highlightJS.registerLanguage('plaintext', plaintext);
|
highlightJS.registerLanguage('plaintext', plaintext);
|
||||||
// highlightJS.registerLanguage('pony', pony);
|
// highlightJS.registerLanguage('pony', pony);
|
||||||
highlightJS.registerLanguage('powershell', powershell);
|
highlightJS.registerLanguage('powershell', powershell);
|
||||||
|
|
@ -331,13 +337,14 @@ highlightJS.registerLanguage('powershell', powershell);
|
||||||
// highlightJS.registerLanguage('prolog', prolog);
|
// highlightJS.registerLanguage('prolog', prolog);
|
||||||
highlightJS.registerLanguage('properties', properties);
|
highlightJS.registerLanguage('properties', properties);
|
||||||
highlightJS.registerLanguage('protobuf', protobuf);
|
highlightJS.registerLanguage('protobuf', protobuf);
|
||||||
highlightJS.registerLanguage('puppet', puppet);
|
// highlightJS.registerLanguage('puppet', puppet);
|
||||||
// highlightJS.registerLanguage('purebasic', purebasic);
|
// highlightJS.registerLanguage('purebasic', purebasic);
|
||||||
highlightJS.registerLanguage('python', python);
|
highlightJS.registerLanguage('python', python);
|
||||||
|
// highlightJS.registerLanguage('python-repl', pythonRepl);
|
||||||
// highlightJS.registerLanguage('q', q);
|
// highlightJS.registerLanguage('q', q);
|
||||||
// highlightJS.registerLanguage('qml', qml);
|
// highlightJS.registerLanguage('qml', qml);
|
||||||
highlightJS.registerLanguage('r', r);
|
// highlightJS.registerLanguage('r', r);
|
||||||
highlightJS.registerLanguage('reasonml', reasonml);
|
// highlightJS.registerLanguage('reasonml', reasonml);
|
||||||
// highlightJS.registerLanguage('rib', rib);
|
// highlightJS.registerLanguage('rib', rib);
|
||||||
// highlightJS.registerLanguage('roboconf', roboconf);
|
// highlightJS.registerLanguage('roboconf', roboconf);
|
||||||
// highlightJS.registerLanguage('routeros', routeros);
|
// highlightJS.registerLanguage('routeros', routeros);
|
||||||
|
|
@ -346,7 +353,7 @@ highlightJS.registerLanguage('reasonml', reasonml);
|
||||||
highlightJS.registerLanguage('rust', rust);
|
highlightJS.registerLanguage('rust', rust);
|
||||||
// highlightJS.registerLanguage('sas', sas);
|
// highlightJS.registerLanguage('sas', sas);
|
||||||
highlightJS.registerLanguage('scala', scala);
|
highlightJS.registerLanguage('scala', scala);
|
||||||
highlightJS.registerLanguage('scheme', scheme);
|
// highlightJS.registerLanguage('scheme', scheme);
|
||||||
// highlightJS.registerLanguage('scilab', scilab);
|
// highlightJS.registerLanguage('scilab', scilab);
|
||||||
highlightJS.registerLanguage('scss', scss);
|
highlightJS.registerLanguage('scss', scss);
|
||||||
highlightJS.registerLanguage('shell', shell);
|
highlightJS.registerLanguage('shell', shell);
|
||||||
|
|
@ -358,14 +365,13 @@ highlightJS.registerLanguage('sql', sql);
|
||||||
// highlightJS.registerLanguage('stan', stan);
|
// highlightJS.registerLanguage('stan', stan);
|
||||||
// highlightJS.registerLanguage('stata', stata);
|
// highlightJS.registerLanguage('stata', stata);
|
||||||
// highlightJS.registerLanguage('step21', step21);
|
// highlightJS.registerLanguage('step21', step21);
|
||||||
highlightJS.registerLanguage('stylus', stylus);
|
// highlightJS.registerLanguage('stylus', stylus);
|
||||||
// highlightJS.registerLanguage('subunit', subunit);
|
// highlightJS.registerLanguage('subunit', subunit);
|
||||||
highlightJS.registerLanguage('swift', swift);
|
highlightJS.registerLanguage('swift', swift);
|
||||||
// highlightJS.registerLanguage('taggerscript', taggerscript);
|
// highlightJS.registerLanguage('taggerscript', taggerscript);
|
||||||
highlightJS.registerLanguage('yaml', yaml);
|
highlightJS.registerLanguage('yaml', yaml);
|
||||||
// highlightJS.registerLanguage('tap', tap);
|
// highlightJS.registerLanguage('tap', tap);
|
||||||
// highlightJS.registerLanguage('tcl', tcl);
|
// highlightJS.registerLanguage('tcl', tcl);
|
||||||
highlightJS.registerLanguage('tex', tex);
|
|
||||||
// highlightJS.registerLanguage('thrift', thrift);
|
// highlightJS.registerLanguage('thrift', thrift);
|
||||||
// highlightJS.registerLanguage('tp', tp);
|
// highlightJS.registerLanguage('tp', tp);
|
||||||
// highlightJS.registerLanguage('twig', twig);
|
// highlightJS.registerLanguage('twig', twig);
|
||||||
|
|
@ -373,10 +379,10 @@ highlightJS.registerLanguage('typescript', typescript);
|
||||||
// highlightJS.registerLanguage('vala', vala);
|
// highlightJS.registerLanguage('vala', vala);
|
||||||
// highlightJS.registerLanguage('vbnet', vbnet);
|
// highlightJS.registerLanguage('vbnet', vbnet);
|
||||||
// highlightJS.registerLanguage('vbscript', vbscript);
|
// highlightJS.registerLanguage('vbscript', vbscript);
|
||||||
// highlightJS.registerLanguage('vbscript-html', vbscript-html);
|
// highlightJS.registerLanguage('vbscript-html', vbscriptHtml);
|
||||||
// highlightJS.registerLanguage('verilog', verilog);
|
// highlightJS.registerLanguage('verilog', verilog);
|
||||||
// highlightJS.registerLanguage('vhdl', vhdl);
|
// highlightJS.registerLanguage('vhdl', vhdl);
|
||||||
highlightJS.registerLanguage('vim', vim);
|
// highlightJS.registerLanguage('vim', vim);
|
||||||
// highlightJS.registerLanguage('x86asm', x86asm);
|
// highlightJS.registerLanguage('x86asm', x86asm);
|
||||||
// highlightJS.registerLanguage('xl', xl);
|
// highlightJS.registerLanguage('xl', xl);
|
||||||
// highlightJS.registerLanguage('xquery', xquery);
|
// highlightJS.registerLanguage('xquery', xquery);
|
||||||
|
|
|
||||||
5
tsconfig.eslint.json
Normal file
5
tsconfig.eslint.json
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"extends": "./tsconfig.json",
|
||||||
|
"exclude": ["node_modules"],
|
||||||
|
"include": ["./**/*"]
|
||||||
|
}
|
||||||
|
|
@ -1,28 +1,37 @@
|
||||||
{
|
{
|
||||||
|
"include": ["src/**/*", "typings/**/*"],
|
||||||
|
"exclude": ["node_modules", "src/__tests__/**"],
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "./_target",
|
"outDir": "bundles-out",
|
||||||
"target": "es5",
|
"module": "CommonJS",
|
||||||
"module": "commonjs",
|
"moduleResolution": "Node",
|
||||||
"moduleResolution": "node",
|
"target": "ES6",
|
||||||
"lib": ["es2015", "dom"],
|
"lib": ["ES6", "DOM"],
|
||||||
|
"jsx": "preserve",
|
||||||
"allowJs": false,
|
"allowJs": false,
|
||||||
|
"checkJs": false,
|
||||||
|
"importHelpers": false,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"resolveJsonModule": true,
|
||||||
"declaration": true,
|
"declaration": true,
|
||||||
"declarationMap": true,
|
"declarationMap": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"noEmit": false,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"incremental": false,
|
||||||
"strictNullChecks": true,
|
"strictNullChecks": true,
|
||||||
"removeComments": true,
|
"removeComments": true,
|
||||||
"preserveConstEnums": true,
|
"preserveConstEnums": true,
|
||||||
"sourceMap": true,
|
|
||||||
"alwaysStrict": true,
|
"alwaysStrict": true,
|
||||||
"strict": true,
|
|
||||||
"noImplicitAny": true,
|
"noImplicitAny": true,
|
||||||
"noImplicitThis": true,
|
"noImplicitThis": true
|
||||||
"noUnusedParameters": true,
|
}
|
||||||
"noUnusedLocals": true,
|
|
||||||
"noImplicitReturns": true,
|
|
||||||
"noFallthroughCasesInSwitch": true,
|
|
||||||
"forceConsistentCasingInFileNames": true,
|
|
||||||
"esModuleInterop": true
|
|
||||||
},
|
|
||||||
"include": ["./src/**/*", "./typings/**/*"],
|
|
||||||
"exclude": ["node_modules", "./src/__tests__/*"]
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
5
typings/highlight.js/highlight.js.d.ts
vendored
5
typings/highlight.js/highlight.js.d.ts
vendored
|
|
@ -1,5 +0,0 @@
|
||||||
declare module 'highlight.js/lib/highlight.js' {
|
|
||||||
import hljs from 'highlight.js';
|
|
||||||
|
|
||||||
export = hljs;
|
|
||||||
}
|
|
||||||
5
typings/highlight.js/languages.d.ts
vendored
5
typings/highlight.js/languages.d.ts
vendored
|
|
@ -1,5 +0,0 @@
|
||||||
declare module 'highlight.js/lib/languages/*' {
|
|
||||||
import { HLJSStatic, IModeBase } from 'highlight.js';
|
|
||||||
|
|
||||||
export default function(hljs?: HLJSStatic): IModeBase;
|
|
||||||
}
|
|
||||||
|
|
@ -3,17 +3,52 @@ import path from 'path';
|
||||||
import webpack from 'webpack';
|
import webpack from 'webpack';
|
||||||
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
import HtmlWebpackPlugin from 'html-webpack-plugin';
|
||||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||||
import CopyWebpackPlugin from 'copy-webpack-plugin';
|
import CopyPlugin from 'copy-webpack-plugin';
|
||||||
|
|
||||||
const pages = ['index', 'demo'];
|
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 => {
|
const config: webpack.Configuration[] = pages.map(page => {
|
||||||
return {
|
return {
|
||||||
devServer: {
|
|
||||||
port: 3000,
|
|
||||||
open: true,
|
|
||||||
contentBase: path.join(__dirname, './website'),
|
|
||||||
},
|
|
||||||
entry: {
|
entry: {
|
||||||
[page]: `./website/templates/pages/${page}/${page}.ts`,
|
[page]: `./website/templates/pages/${page}/${page}.ts`,
|
||||||
},
|
},
|
||||||
|
|
@ -108,39 +143,7 @@ const config: webpack.Configuration[] = pages.map(page => {
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: plugins(page),
|
||||||
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="hero-body">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1 class="title is-size-1 is-spaced">Demo<a href="#help">
|
<h1 class="title is-size-1 is-spaced">Demo<a href="#help">
|
||||||
<svg height="32" class="octicon octicon-unverified" viewBox="0 0 16 16" version="1.1" width="64"
|
<svg fill="currentColor" height="32" class="octicon octicon-unverified" viewBox="0 0 16 16" version="1.1" width="64"
|
||||||
aria-hidden="true">
|
aria-hidden="true">
|
||||||
<path
|
<path
|
||||||
d="M15.67 7.06l-1.08-1.34c-.17-.22-.28-.48-.31-.77l-.19-1.7a1.51 1.51 0 0 0-1.33-1.33l-1.7-.19c-.3-.03-.56-.16-.78-.33L8.94.32c-.55-.44-1.33-.44-1.88 0L5.72 1.4c-.22.17-.48.28-.77.31l-1.7.19c-.7.08-1.25.63-1.33 1.33l-.19 1.7c-.03.3-.16.56-.33.78L.32 7.05c-.44.55-.44 1.33 0 1.88l1.08 1.34c.17.22.28.48.31.77l.19 1.7c.08.7.63 1.25 1.33 1.33l1.7.19c.3.03.56.16.78.33l1.34 1.08c.55.44 1.33.44 1.88 0l1.34-1.08c.22-.17.48-.28.77-.31l1.7-.19c.7-.08 1.25-.63 1.33-1.33l.19-1.7c.03-.3.16-.56.33-.78l1.08-1.34c.44-.55.44-1.33 0-1.88zM9 11.5c0 .28-.22.5-.5.5h-1c-.27 0-.5-.22-.5-.5v-1c0-.28.23-.5.5-.5h1c.28 0 .5.22.5.5v1zm1.56-4.89c-.06.17-.17.33-.3.47-.13.16-.14.19-.33.38-.16.17-.31.3-.52.45-.11.09-.2.19-.28.27-.08.08-.14.17-.19.27-.05.1-.08.19-.11.3-.03.11-.03.13-.03.25H7.13c0-.22 0-.31.03-.48.03-.19.08-.36.14-.52.06-.14.14-.28.25-.42.11-.13.23-.25.41-.38.27-.19.36-.3.48-.52.12-.22.2-.38.2-.59 0-.27-.06-.45-.2-.58-.13-.13-.31-.19-.58-.19-.09 0-.19.02-.3.05-.11.03-.17.09-.25.16-.08.07-.14.11-.2.2a.41.41 0 0 0-.09.28h-2c0-.38.13-.56.27-.83.16-.27.36-.5.61-.67.25-.17.55-.3.88-.38.33-.08.7-.13 1.09-.13.44 0 .83.05 1.17.13.34.09.63.22.88.39.23.17.41.38.55.63.13.25.19.55.19.88 0 .22 0 .42-.08.59l-.02-.01z">
|
d="M15.67 7.06l-1.08-1.34c-.17-.22-.28-.48-.31-.77l-.19-1.7a1.51 1.51 0 0 0-1.33-1.33l-1.7-.19c-.3-.03-.56-.16-.78-.33L8.94.32c-.55-.44-1.33-.44-1.88 0L5.72 1.4c-.22.17-.48.28-.77.31l-1.7.19c-.7.08-1.25.63-1.33 1.33l-.19 1.7c-.03.3-.16.56-.33.78L.32 7.05c-.44.55-.44 1.33 0 1.88l1.08 1.34c.17.22.28.48.31.77l.19 1.7c.08.7.63 1.25 1.33 1.33l1.7.19c.3.03.56.16.78.33l1.34 1.08c.55.44 1.33.44 1.88 0l1.34-1.08c.22-.17.48-.28.77-.31l1.7-.19c.7-.08 1.25-.63 1.33-1.33l.19-1.7c.03-.3.16-.56.33-.78l1.08-1.34c.44-.55.44-1.33 0-1.88zM9 11.5c0 .28-.22.5-.5.5h-1c-.27 0-.5-.22-.5-.5v-1c0-.28.23-.5.5-.5h1c.28 0 .5.22.5.5v1zm1.56-4.89c-.06.17-.17.33-.3.47-.13.16-.14.19-.33.38-.16.17-.31.3-.52.45-.11.09-.2.19-.28.27-.08.08-.14.17-.19.27-.05.1-.08.19-.11.3-.03.11-.03.13-.03.25H7.13c0-.22 0-.31.03-.48.03-.19.08-.36.14-.52.06-.14.14-.28.25-.42.11-.13.23-.25.41-.38.27-.19.36-.3.48-.52.12-.22.2-.38.2-.59 0-.27-.06-.45-.2-.58-.13-.13-.31-.19-.58-.19-.09 0-.19.02-.3.05-.11.03-.17.09-.25.16-.08.07-.14.11-.2.2a.41.41 0 0 0-.09.28h-2c0-.38.13-.56.27-.83.16-.27.36-.5.61-.67.25-.17.55-.3.88-.38.33-.08.7-.13 1.09-.13.44 0 .83.05 1.17.13.34.09.63.22.88.39.23.17.41.38.55.63.13.25.19.55.19.88 0 .22 0 .42-.08.59l-.02-.01z">
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="columns is-desktop is-multiline">
|
<div class="columns is-desktop is-multiline">
|
||||||
<div class="column is-one-fifth-widescreen">
|
<div class="column is-one-sixth-widescreen">
|
||||||
<label title="Output format of the HTML, either line by line or side by side">
|
<label title="Output format of the HTML, either line by line or side by side">
|
||||||
<p>Output Format</p>
|
<p>Output Format</p>
|
||||||
<select class="options-label-value" id="diff-url-options-output-format" name="outputFormat">
|
<select class="options-label-value" id="diff-url-options-output-format" name="outputFormat">
|
||||||
|
|
@ -42,14 +42,24 @@
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-one-fifth-widescreen">
|
<div class="column is-one-sixth-widescreen">
|
||||||
|
<label title="Color scheme to render. Auto uses user preference.">
|
||||||
|
<p>Color Scheme</p>
|
||||||
|
<select class="options-label-value" id="diff-url-options-color-scheme" name="colorScheme">
|
||||||
|
<option value="light" selected>Light</option>
|
||||||
|
<option value="dark">Dark</option>
|
||||||
|
<option value="auto">Auto</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="column is-one-sixth-widescreen">
|
||||||
<label title="Show the file list summary before the diff">
|
<label title="Show the file list summary before the diff">
|
||||||
<p>File Summary</p>
|
<p>File Summary</p>
|
||||||
<input class="options-label-value" id="diff-url-options-show-files" type="checkbox" name="drawFileList"
|
<input class="options-label-value" id="diff-url-options-show-files" type="checkbox" name="drawFileList"
|
||||||
checked />
|
checked />
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-one-fifth-widescreen">
|
<div class="column is-one-sixth-widescreen">
|
||||||
<label title="Level of matching for the comparison algorithm">
|
<label title="Level of matching for the comparison algorithm">
|
||||||
<p>Matching Type</p>
|
<p>Matching Type</p>
|
||||||
<select class="options-label-value" id="diff-url-options-matching" name="matching">
|
<select class="options-label-value" id="diff-url-options-matching" name="matching">
|
||||||
|
|
@ -59,14 +69,14 @@
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-one-fifth-widescreen">
|
<div class="column is-one-sixth-widescreen">
|
||||||
<label title="Similarity threshold for the matching algorithm">
|
<label title="Similarity threshold for the matching algorithm">
|
||||||
<p>Words Threshold</p>
|
<p>Words Threshold</p>
|
||||||
<input class="options-label-value" id="diff-url-options-match-words-threshold" type="number"
|
<input class="options-label-value" id="diff-url-options-match-words-threshold" type="number"
|
||||||
name="matchWordsThreshold" value="0.25" step="0.05" min="0" max="1" />
|
name="matchWordsThreshold" value="0.25" step="0.05" min="0" max="1" />
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-one-fifth-widescreen">
|
<div class="column is-one-sixth-widescreen">
|
||||||
<label title="Maximum number of comparison performed by the matching algorithm in a block of changes">
|
<label title="Maximum number of comparison performed by the matching algorithm in a block of changes">
|
||||||
<p>Max Comparisons</p>
|
<p>Max Comparisons</p>
|
||||||
<input class="options-label-value" id="diff-url-options-matching-max-comparisons" type="number"
|
<input class="options-label-value" id="diff-url-options-matching-max-comparisons" type="number"
|
||||||
|
|
@ -89,7 +99,7 @@
|
||||||
<ul>
|
<ul>
|
||||||
<li class="block">
|
<li class="block">
|
||||||
<p class="has-text-weight-bold">Why should I use this instead of GitHub, Bitbucket or GitLab?</p>
|
<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 devided in two categories: portability and
|
<p>There are multiple advantages to using diff2html, but they can be divided in two categories: portability and
|
||||||
features.
|
features.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -100,7 +110,7 @@
|
||||||
Regarding features you can have code syntax highlight, line similarity matching (similar lines are together),
|
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.
|
line by Line and side by side diffs and easy code selection.
|
||||||
</p>
|
</p>
|
||||||
<p>All of this is completly independent of the provider you use to version the code.</p>
|
<p>All of this is completely independent of the provider you use to version the code.</p>
|
||||||
</li>
|
</li>
|
||||||
<li class="block">
|
<li class="block">
|
||||||
<p class="has-text-weight-bold">What urls are supported in this demo?</p>
|
<p class="has-text-weight-bold">What urls are supported in this demo?</p>
|
||||||
|
|
@ -112,7 +122,7 @@
|
||||||
<p>Just copy the url from the page, which should contain all the customizations and reference for the diff you
|
<p>Just copy the url from the page, which should contain all the customizations and reference for the diff you
|
||||||
introduced.</p>
|
introduced.</p>
|
||||||
<p>ex: <a
|
<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&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>
|
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>
|
||||||
</p>
|
</p>
|
||||||
</li>
|
</li>
|
||||||
<li class="block">
|
<li class="block">
|
||||||
|
|
@ -134,4 +144,4 @@
|
||||||
providing better diff support for existing online services.
|
providing better diff support for existing online services.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -5,3 +5,21 @@
|
||||||
.diff-url-btn.is-small {
|
.diff-url-btn.is-small {
|
||||||
font-size: 0.85rem;
|
font-size: 0.85rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .title {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .footer {
|
||||||
|
background-color: #2d2d2d;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.d2h-auto-color-scheme .title {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-auto-color-scheme .footer {
|
||||||
|
background-color: #2d2d2d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,11 @@ import { Diff2HtmlUI, defaultDiff2HtmlUIConfig, Diff2HtmlUIConfig } from '../../
|
||||||
|
|
||||||
import '../../../main.ts';
|
import '../../../main.ts';
|
||||||
import '../../../main.css';
|
import '../../../main.css';
|
||||||
import 'highlight.js/styles/github.css';
|
import './github-highlights.css';
|
||||||
import '../../../../src/ui/css/diff2html.css';
|
import '../../../../src/ui/css/diff2html.css';
|
||||||
import './demo.css';
|
import './demo.css';
|
||||||
|
import { colorSchemeToCss } from '../../../../src/render-utils';
|
||||||
|
import { ColorSchemeType } from '../../../../src/types';
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Example URLs:
|
* Example URLs:
|
||||||
|
|
@ -21,7 +23,8 @@ import './demo.css';
|
||||||
|
|
||||||
type URLParams = {
|
type URLParams = {
|
||||||
diff?: string;
|
diff?: string;
|
||||||
[key: string]: string | boolean | number | undefined;
|
diffTooBigMessage?: string;
|
||||||
|
[key: string]: string | boolean | number | Map<string, string> | undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
const searchParam = 'diff';
|
const searchParam = 'diff';
|
||||||
|
|
@ -64,11 +67,14 @@ function prepareRequest(url: string): Request {
|
||||||
let fetchUrl;
|
let fetchUrl;
|
||||||
const headers = new Headers();
|
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 githubPrUrl = /^https?:\/\/(?:www\.)?github\.com\/(.*?)\/(.*?)\/pull\/(.*?)(?:\.diff)?(?:\.patch)?(?:\/.*)?$/;
|
||||||
|
|
||||||
const gitlabCommitUrl = /^https?:\/\/(?:www\.)?gitlab\.com\/(.*?)\/(.*?)\/commit\/(.*?)(?:\.diff)?(?:\.patch)?(?:\/.*)?$/;
|
const gitlabCommitUrl =
|
||||||
const gitlabPrUrl = /^https?:\/\/(?:www\.)?gitlab\.com\/(.*?)\/(.*?)\/merge_requests\/(.*?)(?:\.diff)?(?:\.patch)?(?:\/.*)?$/;
|
/^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 bitbucketCommitUrl = /^https?:\/\/(?:www\.)?bitbucket\.org\/(.*?)\/(.*?)\/commits\/(.*?)(?:\/raw)?(?:\/.*)?$/;
|
||||||
const bitbucketPrUrl = /^https?:\/\/(?:www\.)?bitbucket\.org\/(.*?)\/(.*?)\/pull-requests\/(.*?)(?:\/.*)?$/;
|
const bitbucketPrUrl = /^https?:\/\/(?:www\.)?bitbucket\.org\/(.*?)\/(.*?)\/pull-requests\/(.*?)(?:\/.*)?$/;
|
||||||
|
|
@ -106,8 +112,7 @@ function prepareRequest(url: string): Request {
|
||||||
} else if ((values = bitbucketPrUrl.exec(url))) {
|
} else if ((values = bitbucketPrUrl.exec(url))) {
|
||||||
fetchUrl = bitbucketUrlGen(values[1], values[2], 'pullrequests', values[3]);
|
fetchUrl = bitbucketUrlGen(values[1], values[2], 'pullrequests', values[3]);
|
||||||
} else {
|
} else {
|
||||||
console.info('Could not parse url, using the provided url.');
|
fetchUrl = url;
|
||||||
fetchUrl = 'https://crossorigin.me/' + url;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
@ -117,11 +122,17 @@ function prepareRequest(url: string): Request {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getConfiguration(urlParams: URLParams): Diff2HtmlUIConfig {
|
function getConfiguration(urlParams: URLParams): Diff2HtmlUIConfig {
|
||||||
// Removing `diff` form `urlParams` to avoid being inserted
|
// Removing `diff` and `diffTooBigMessage` form `urlParams` to avoid being inserted
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
const { diff, diffTooBigMessage, ...urlParamsRest } = urlParams;
|
||||||
const { diff, ...urlParamsRest } = urlParams;
|
|
||||||
|
const defaultColorScheme: ColorSchemeType =
|
||||||
|
window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||||
|
? ColorSchemeType.DARK
|
||||||
|
: ColorSchemeType.LIGHT;
|
||||||
|
|
||||||
const config: URLParams = {
|
const config: URLParams = {
|
||||||
...defaultDiff2HtmlUIConfig,
|
...defaultDiff2HtmlUIConfig,
|
||||||
|
colorScheme: defaultColorScheme,
|
||||||
...urlParamsRest,
|
...urlParamsRest,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -129,8 +140,8 @@ function getConfiguration(urlParams: URLParams): Diff2HtmlUIConfig {
|
||||||
const newObject = !Number.isNaN(Number(v))
|
const newObject = !Number.isNaN(Number(v))
|
||||||
? { [k]: Number(v) }
|
? { [k]: Number(v) }
|
||||||
: v === 'true' || v === 'false'
|
: v === 'true' || v === 'false'
|
||||||
? { [k]: Boolean(v) }
|
? { [k]: Boolean(v) }
|
||||||
: { [k]: v };
|
: { [k]: v };
|
||||||
return { ...object, ...newObject };
|
return { ...object, ...newObject };
|
||||||
}, {});
|
}, {});
|
||||||
}
|
}
|
||||||
|
|
@ -152,9 +163,16 @@ async function getDiff(request: Request): Promise<string> {
|
||||||
|
|
||||||
function draw(diffString: string, config: Diff2HtmlUIConfig, elements: Elements): void {
|
function draw(diffString: string, config: Diff2HtmlUIConfig, elements: Elements): void {
|
||||||
const diff2htmlUi = new Diff2HtmlUI(elements.structure.diffTarget, diffString, config);
|
const diff2htmlUi = new Diff2HtmlUI(elements.structure.diffTarget, diffString, config);
|
||||||
|
|
||||||
|
setBodyColorScheme(diff2htmlUi.config.colorScheme);
|
||||||
|
|
||||||
diff2htmlUi.draw();
|
diff2htmlUi.draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setBodyColorScheme(colorScheme: ColorSchemeType): void {
|
||||||
|
document.body.className = colorSchemeToCss(colorScheme);
|
||||||
|
}
|
||||||
|
|
||||||
async function prepareInitialState(elements: Elements): Promise<[Diff2HtmlUIConfig, string]> {
|
async function prepareInitialState(elements: Elements): Promise<[Diff2HtmlUIConfig, string]> {
|
||||||
const urlParams = getParamsFromSearch(window.location.search);
|
const urlParams = getParamsFromSearch(window.location.search);
|
||||||
const currentUrl = (urlParams && urlParams[searchParam]) || 'https://github.com/rtfpessoa/diff2html/pull/106';
|
const currentUrl = (urlParams && urlParams[searchParam]) || 'https://github.com/rtfpessoa/diff2html/pull/106';
|
||||||
|
|
@ -170,23 +188,21 @@ async function prepareInitialState(elements: Elements): Promise<[Diff2HtmlUIConf
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateBrowserUrl(config: Diff2HtmlUIConfig, newDiffUrl: string): void {
|
function updateBrowserUrl(config: Diff2HtmlUIConfig, newDiffUrl: string): void {
|
||||||
if (history.pushState) {
|
const paramString = Object.entries(config)
|
||||||
const paramString = Object.entries(config)
|
.map(([k, v]) => k + '=' + v)
|
||||||
.map(([k, v]) => k + '=' + v)
|
.join('&');
|
||||||
.join('&');
|
const newPageUrl =
|
||||||
const newPageUrl =
|
window.location.protocol +
|
||||||
window.location.protocol +
|
'//' +
|
||||||
'//' +
|
window.location.host +
|
||||||
window.location.host +
|
window.location.pathname +
|
||||||
window.location.pathname +
|
'?' +
|
||||||
'?' +
|
paramString +
|
||||||
paramString +
|
'&' +
|
||||||
'&' +
|
searchParam +
|
||||||
searchParam +
|
'=' +
|
||||||
'=' +
|
newDiffUrl;
|
||||||
newDiffUrl;
|
window.history.pushState({ path: newPageUrl }, '', newPageUrl);
|
||||||
window.history.pushState({ path: newPageUrl }, '', newPageUrl);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Elements = {
|
type Elements = {
|
||||||
|
|
@ -199,6 +215,7 @@ type Elements = {
|
||||||
};
|
};
|
||||||
options: {
|
options: {
|
||||||
outputFormat: HTMLInputElement;
|
outputFormat: HTMLInputElement;
|
||||||
|
colorScheme: HTMLInputElement;
|
||||||
matching: HTMLInputElement;
|
matching: HTMLInputElement;
|
||||||
wordsThreshold: HTMLInputElement;
|
wordsThreshold: HTMLInputElement;
|
||||||
matchingMaxComparisons: HTMLInputElement;
|
matchingMaxComparisons: HTMLInputElement;
|
||||||
|
|
@ -234,6 +251,7 @@ function getHTMLElementById(id: string): HTMLElement {
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', async () => {
|
document.addEventListener('DOMContentLoaded', async () => {
|
||||||
// Improves browser compatibility
|
// Improves browser compatibility
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||||
require('whatwg-fetch');
|
require('whatwg-fetch');
|
||||||
|
|
||||||
const drawAndUpdateUrl = async (
|
const drawAndUpdateUrl = async (
|
||||||
|
|
@ -258,6 +276,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
outputFormat: getHTMLInputElementById('diff-url-options-output-format'),
|
outputFormat: getHTMLInputElementById('diff-url-options-output-format'),
|
||||||
|
colorScheme: getHTMLInputElementById('diff-url-options-color-scheme'),
|
||||||
matching: getHTMLInputElementById('diff-url-options-matching'),
|
matching: getHTMLInputElementById('diff-url-options-matching'),
|
||||||
wordsThreshold: getHTMLInputElementById('diff-url-options-match-words-threshold'),
|
wordsThreshold: getHTMLInputElementById('diff-url-options-match-words-threshold'),
|
||||||
matchingMaxComparisons: getHTMLInputElementById('diff-url-options-matching-max-comparisons'),
|
matchingMaxComparisons: getHTMLInputElementById('diff-url-options-matching-max-comparisons'),
|
||||||
|
|
@ -270,12 +289,13 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||||
let [config, diffString] = await prepareInitialState(elements);
|
let [config, diffString] = await prepareInitialState(elements);
|
||||||
|
|
||||||
// Update HTML inputs from any changes in URL
|
// Update HTML inputs from any changes in URL
|
||||||
config.outputFormat && (elements.options.outputFormat.value = config.outputFormat);
|
if (config.outputFormat) elements.options.outputFormat.value = config.outputFormat;
|
||||||
config.drawFileList && (elements.checkboxes.drawFileList.checked = config.drawFileList);
|
if (config.colorScheme) elements.options.colorScheme.value = config.colorScheme;
|
||||||
config.matching && (elements.options.matching.value = config.matching);
|
if (config.drawFileList) elements.checkboxes.drawFileList.checked = config.drawFileList;
|
||||||
config.matchWordsThreshold && (elements.options.wordsThreshold.value = config.matchWordsThreshold.toString());
|
if (config.matching) elements.options.matching.value = config.matching;
|
||||||
config.matchingMaxComparisons &&
|
if (config.matchWordsThreshold) elements.options.wordsThreshold.value = config.matchWordsThreshold.toString();
|
||||||
(elements.options.matchingMaxComparisons.value = config.matchingMaxComparisons.toString());
|
if (config.matchingMaxComparisons)
|
||||||
|
elements.options.matchingMaxComparisons.value = config.matchingMaxComparisons.toString();
|
||||||
|
|
||||||
Object.entries(elements.options).forEach(([option, element]) =>
|
Object.entries(elements.options).forEach(([option, element]) =>
|
||||||
element.addEventListener('change', () => {
|
element.addEventListener('change', () => {
|
||||||
|
|
|
||||||
332
website/templates/pages/demo/github-highlights.css
Normal file
332
website/templates/pages/demo/github-highlights.css
Normal file
|
|
@ -0,0 +1,332 @@
|
||||||
|
/*!
|
||||||
|
Theme Adapted from highlight.js github theme
|
||||||
|
Theme: Modified GitHub Dark
|
||||||
|
Description: Dark theme as seen on github.com, modified for diff2html demo
|
||||||
|
Author: github.com
|
||||||
|
Maintainer: @Hirse
|
||||||
|
Updated: 2021-05-15
|
||||||
|
|
||||||
|
Outdated base version: https://github.com/primer/github-syntax-dark
|
||||||
|
Current colors taken from GitHub's CSS
|
||||||
|
*/
|
||||||
|
|
||||||
|
pre code.hljs {
|
||||||
|
display: block;
|
||||||
|
overflow-x: auto;
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
code.hljs {
|
||||||
|
padding: 3px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs {
|
||||||
|
color: #24292e;
|
||||||
|
}
|
||||||
|
.hljs-doctag,
|
||||||
|
.hljs-keyword,
|
||||||
|
.hljs-meta .hljs-keyword,
|
||||||
|
.hljs-template-tag,
|
||||||
|
.hljs-template-variable,
|
||||||
|
.hljs-type,
|
||||||
|
.hljs-variable.language_ {
|
||||||
|
color: #d73a49;
|
||||||
|
}
|
||||||
|
.hljs-title,
|
||||||
|
.hljs-title.class_,
|
||||||
|
.hljs-title.class_.inherited__,
|
||||||
|
.hljs-title.function_ {
|
||||||
|
color: #6f42c1;
|
||||||
|
}
|
||||||
|
.hljs-attr,
|
||||||
|
.hljs-attribute,
|
||||||
|
.hljs-literal,
|
||||||
|
.hljs-meta,
|
||||||
|
.hljs-number,
|
||||||
|
.hljs-operator,
|
||||||
|
.hljs-selector-attr,
|
||||||
|
.hljs-selector-class,
|
||||||
|
.hljs-selector-id,
|
||||||
|
.hljs-variable {
|
||||||
|
color: #005cc5;
|
||||||
|
}
|
||||||
|
.hljs-meta .hljs-string,
|
||||||
|
.hljs-regexp,
|
||||||
|
.hljs-string {
|
||||||
|
color: #032f62;
|
||||||
|
}
|
||||||
|
.hljs-built_in,
|
||||||
|
.hljs-symbol {
|
||||||
|
color: #e36209;
|
||||||
|
}
|
||||||
|
.hljs-code,
|
||||||
|
.hljs-comment,
|
||||||
|
.hljs-formula {
|
||||||
|
color: #6a737d;
|
||||||
|
}
|
||||||
|
.hljs-name,
|
||||||
|
.hljs-quote,
|
||||||
|
.hljs-selector-pseudo,
|
||||||
|
.hljs-selector-tag {
|
||||||
|
color: #22863a;
|
||||||
|
}
|
||||||
|
.hljs-subst {
|
||||||
|
color: #24292e;
|
||||||
|
}
|
||||||
|
.hljs-section {
|
||||||
|
color: #005cc5;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.hljs-bullet {
|
||||||
|
color: #735c0f;
|
||||||
|
}
|
||||||
|
.hljs-emphasis {
|
||||||
|
color: #24292e;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.hljs-strong {
|
||||||
|
color: #24292e;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.hljs-addition {
|
||||||
|
color: #22863a;
|
||||||
|
background-color: #f0fff4;
|
||||||
|
}
|
||||||
|
.hljs-deletion {
|
||||||
|
color: #b31d28;
|
||||||
|
background-color: #ffeef0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d2h-dark-color-scheme .hljs {
|
||||||
|
color: #c9d1d9;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-doctag,
|
||||||
|
.d2h-dark-color-scheme .hljs-keyword,
|
||||||
|
.d2h-dark-color-scheme .hljs-meta .hljs-keyword,
|
||||||
|
.d2h-dark-color-scheme .hljs-template-tag,
|
||||||
|
.d2h-dark-color-scheme .hljs-template-variable,
|
||||||
|
.d2h-dark-color-scheme .hljs-type,
|
||||||
|
.d2h-dark-color-scheme .hljs-variable.language_ {
|
||||||
|
color: #ff7b72;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-title,
|
||||||
|
.d2h-dark-color-scheme .hljs-title.class_,
|
||||||
|
.d2h-dark-color-scheme .hljs-title.class_.inherited__,
|
||||||
|
.d2h-dark-color-scheme .hljs-title.function_ {
|
||||||
|
color: #d2a8ff;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-attr,
|
||||||
|
.d2h-dark-color-scheme .hljs-attribute,
|
||||||
|
.d2h-dark-color-scheme .hljs-literal,
|
||||||
|
.d2h-dark-color-scheme .hljs-meta,
|
||||||
|
.d2h-dark-color-scheme .hljs-number,
|
||||||
|
.d2h-dark-color-scheme .hljs-operator,
|
||||||
|
.d2h-dark-color-scheme .hljs-selector-attr,
|
||||||
|
.d2h-dark-color-scheme .hljs-selector-class,
|
||||||
|
.d2h-dark-color-scheme .hljs-selector-id,
|
||||||
|
.d2h-dark-color-scheme .hljs-variable {
|
||||||
|
color: #79c0ff;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-meta .hljs-string,
|
||||||
|
.d2h-dark-color-scheme .hljs-regexp,
|
||||||
|
.d2h-dark-color-scheme .hljs-string {
|
||||||
|
color: #a5d6ff;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-built_in,
|
||||||
|
.d2h-dark-color-scheme .hljs-symbol {
|
||||||
|
color: #ffa657;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-code,
|
||||||
|
.d2h-dark-color-scheme .hljs-comment,
|
||||||
|
.d2h-dark-color-scheme .hljs-formula {
|
||||||
|
color: #8b949e;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-name,
|
||||||
|
.d2h-dark-color-scheme .hljs-quote,
|
||||||
|
.d2h-dark-color-scheme .hljs-selector-pseudo,
|
||||||
|
.d2h-dark-color-scheme .hljs-selector-tag {
|
||||||
|
color: #7ee787;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-subst {
|
||||||
|
color: #c9d1d9;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-section {
|
||||||
|
color: #1f6feb;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-bullet {
|
||||||
|
color: #f2cc60;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-emphasis {
|
||||||
|
color: #c9d1d9;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-strong {
|
||||||
|
color: #c9d1d9;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-addition {
|
||||||
|
color: #aff5b4;
|
||||||
|
background-color: #033a16;
|
||||||
|
}
|
||||||
|
.d2h-dark-color-scheme .hljs-deletion {
|
||||||
|
color: #ffdcd7;
|
||||||
|
background-color: #67060c;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
.d2h-auto-color-scheme .hljs {
|
||||||
|
color: #c9d1d9;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-doctag,
|
||||||
|
.d2h-auto-color-scheme .hljs-keyword,
|
||||||
|
.d2h-auto-color-scheme .hljs-meta .hljs-keyword,
|
||||||
|
.d2h-auto-color-scheme .hljs-template-tag,
|
||||||
|
.d2h-auto-color-scheme .hljs-template-variable,
|
||||||
|
.d2h-auto-color-scheme .hljs-type,
|
||||||
|
.d2h-auto-color-scheme .hljs-variable.language_ {
|
||||||
|
color: #ff7b72;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-title,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.class_,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.class_.inherited__,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.function_ {
|
||||||
|
color: #d2a8ff;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-attr,
|
||||||
|
.d2h-auto-color-scheme .hljs-attribute,
|
||||||
|
.d2h-auto-color-scheme .hljs-literal,
|
||||||
|
.d2h-auto-color-scheme .hljs-meta,
|
||||||
|
.d2h-auto-color-scheme .hljs-number,
|
||||||
|
.d2h-auto-color-scheme .hljs-operator,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-attr,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-class,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-id,
|
||||||
|
.d2h-auto-color-scheme .hljs-variable {
|
||||||
|
color: #79c0ff;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-meta .hljs-string,
|
||||||
|
.d2h-auto-color-scheme .hljs-regexp,
|
||||||
|
.d2h-auto-color-scheme .hljs-string {
|
||||||
|
color: #a5d6ff;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-built_in,
|
||||||
|
.d2h-auto-color-scheme .hljs-symbol {
|
||||||
|
color: #ffa657;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-code,
|
||||||
|
.d2h-auto-color-scheme .hljs-comment,
|
||||||
|
.d2h-auto-color-scheme .hljs-formula {
|
||||||
|
color: #8b949e;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-name,
|
||||||
|
.d2h-auto-color-scheme .hljs-quote,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-pseudo,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-tag {
|
||||||
|
color: #7ee787;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-subst {
|
||||||
|
color: #c9d1d9;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-section {
|
||||||
|
color: #1f6feb;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-bullet {
|
||||||
|
color: #f2cc60;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-emphasis {
|
||||||
|
color: #c9d1d9;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-strong {
|
||||||
|
color: #c9d1d9;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-addition {
|
||||||
|
color: #aff5b4;
|
||||||
|
background-color: #033a16;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-deletion {
|
||||||
|
color: #ffdcd7;
|
||||||
|
background-color: #67060c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
.d2h-auto-color-scheme .hljs {
|
||||||
|
color: #24292e;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-doctag,
|
||||||
|
.d2h-auto-color-scheme .hljs-keyword,
|
||||||
|
.d2h-auto-color-scheme .hljs-meta .hljs-keyword,
|
||||||
|
.d2h-auto-color-scheme .hljs-template-tag,
|
||||||
|
.d2h-auto-color-scheme .hljs-template-variable,
|
||||||
|
.d2h-auto-color-scheme .hljs-type,
|
||||||
|
.d2h-auto-color-scheme .hljs-variable.language_ {
|
||||||
|
color: #d73a49;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-title,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.class_,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.class_.inherited__,
|
||||||
|
.d2h-auto-color-scheme .hljs-title.function_ {
|
||||||
|
color: #6f42c1;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-attr,
|
||||||
|
.d2h-auto-color-scheme .hljs-attribute,
|
||||||
|
.d2h-auto-color-scheme .hljs-literal,
|
||||||
|
.d2h-auto-color-scheme .hljs-meta,
|
||||||
|
.d2h-auto-color-scheme .hljs-number,
|
||||||
|
.d2h-auto-color-scheme .hljs-operator,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-attr,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-class,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-id,
|
||||||
|
.d2h-auto-color-scheme .hljs-variable {
|
||||||
|
color: #005cc5;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-meta .hljs-string,
|
||||||
|
.d2h-auto-color-scheme .hljs-regexp,
|
||||||
|
.d2h-auto-color-scheme .hljs-string {
|
||||||
|
color: #032f62;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-built_in,
|
||||||
|
.d2h-auto-color-scheme .hljs-symbol {
|
||||||
|
color: #e36209;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-code,
|
||||||
|
.d2h-auto-color-scheme .hljs-comment,
|
||||||
|
.d2h-auto-color-scheme .hljs-formula {
|
||||||
|
color: #6a737d;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-name,
|
||||||
|
.d2h-auto-color-scheme .hljs-quote,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-pseudo,
|
||||||
|
.d2h-auto-color-scheme .hljs-selector-tag {
|
||||||
|
color: #22863a;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-subst {
|
||||||
|
color: #24292e;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-section {
|
||||||
|
color: #005cc5;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-bullet {
|
||||||
|
color: #735c0f;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-emphasis {
|
||||||
|
color: #24292e;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-strong {
|
||||||
|
color: #24292e;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-addition {
|
||||||
|
color: #22863a;
|
||||||
|
background-color: #f0fff4;
|
||||||
|
}
|
||||||
|
.d2h-auto-color-scheme .hljs-deletion {
|
||||||
|
color: #b31d28;
|
||||||
|
background-color: #ffeef0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -72,7 +72,7 @@
|
||||||
<span class="button clipboard" data-clipboard-text="npm install diff2html" title="Copy">Copy</span>
|
<span class="button clipboard" data-clipboard-text="npm install diff2html" title="Copy">Copy</span>
|
||||||
</div>
|
</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="https://github.com/rtfpessoa/diff2html#how-to-use" target="_blank" rel="noopener" rel="noreferrer">
|
<a href="https://github.com/rtfpessoa/diff2html#usage" target="_blank" rel="noopener" rel="noreferrer">
|
||||||
Find usage examples in the Docs
|
Find usage examples in the Docs
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
@ -85,8 +85,8 @@
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<h4 class="title is-size-4 is-spaced"><strong>With command line integration</strong></h4>
|
<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
|
<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" target="_blank"
|
way. Go here for the <a href="https://github.com/rtfpessoa/diff2html-cli#readme" target="_blank"
|
||||||
rel="noopener" rel="noreferrer"></a>full
|
rel="noopener" rel="noreferrer">full
|
||||||
documentation</a>.
|
documentation</a>.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -115,8 +115,46 @@
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<div id="users" class="container">
|
<div id="users" class="container">
|
||||||
<h4 class="title is-size-4 is-spaced"><strong>Projects using diff2html</strong></h4>
|
<h4 class="title is-size-4 is-spaced"><strong>Sponsor</strong></h4>
|
||||||
<div class="columns is-desktop is-multiline">
|
<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="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
|
|
@ -131,19 +169,21 @@
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="column is-one-quarter-widescreen is-flex">
|
<div class="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
<p class="is-size-5 has-text-weight-bold">Codacy</p>
|
<p class="is-size-5 has-text-weight-bold">Codacy</p>
|
||||||
</header>
|
</header>
|
||||||
<section class="media-content">
|
<section class="media-content">
|
||||||
<p>Check code style, security, duplication, complexity and coverage on every change.</p>
|
<p>Automate code reviews on your commits and pull requests.</p>
|
||||||
</section>
|
</section>
|
||||||
<footer>
|
<footer>
|
||||||
<a href="https://www.codacy.com" target="_blank" rel="noopener" rel="noreferrer">Website</a>
|
<a href="https://www.codacy.com" target="_blank" rel="noopener" rel="noreferrer">Website</a>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="column is-one-quarter-widescreen is-flex">
|
<div class="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
|
|
@ -158,6 +198,7 @@
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="column is-one-quarter-widescreen is-flex">
|
<div class="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
|
|
@ -171,6 +212,7 @@
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="column is-one-quarter-widescreen is-flex">
|
<div class="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
|
|
@ -180,91 +222,12 @@
|
||||||
<p>Show diffs between builds</p>
|
<p>Show diffs between builds</p>
|
||||||
</section>
|
</section>
|
||||||
<footer>
|
<footer>
|
||||||
<a href="https://wiki.jenkins-ci.org/display/JENKINS/Last+Changes+Plugin" target="_blank"
|
<a href="https://plugins.jenkins.io/last-changes/" target="_blank"
|
||||||
rel="noopener" rel="noreferrer">Website</a>
|
rel="noopener" rel="noreferrer">Website</a>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</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="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
|
|
@ -279,41 +242,28 @@
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="column is-one-quarter-widescreen is-flex">
|
<div class="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
<p class="is-size-5 has-text-weight-bold">Chef Automate</p>
|
<p class="is-size-5 has-text-weight-bold">Chef Automate</p>
|
||||||
</header>
|
</header>
|
||||||
<section class="media-content">
|
<section class="media-content">
|
||||||
<p>full suite of enterprise capabilities for maintaining continuous visibility into application,
|
<p>DevOps Dashboard for Complete Operational Visibility.</p>
|
||||||
infrastructure, and security automation.</p>
|
|
||||||
</section>
|
</section>
|
||||||
<footer>
|
<footer>
|
||||||
<a href="https://automate.chef.io/" target="_blank" rel="noopener" rel="noreferrer">Website</a>
|
<a href="https://automate.chef.io/" target="_blank" rel="noopener" rel="noreferrer">Website</a>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="column is-one-quarter-widescreen is-flex">
|
<div class="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
<p class="is-size-5 has-text-weight-bold">Camunda Modeler</p>
|
<p class="is-size-5 has-text-weight-bold">GraphQL Schema Diff</p>
|
||||||
</header>
|
</header>
|
||||||
<section class="media-content">
|
<section class="media-content">
|
||||||
<p>An integrated modeling solution for BPMN, DMN and CMMN based on bpmn.io.</p>
|
<p>Detects dangerous and breaking changes in GraphQL schemas.</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>
|
</section>
|
||||||
<footer>
|
<footer>
|
||||||
<a href="https://github.com/fabsrc/graphql-schema-diff" target="_blank" rel="noopener"
|
<a href="https://github.com/fabsrc/graphql-schema-diff" target="_blank" rel="noopener"
|
||||||
|
|
@ -321,13 +271,14 @@
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="column is-one-quarter-widescreen is-flex">
|
<div class="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
<p class="is-size-5 has-text-weight-bold">cypress-plugin-snapshots</p>
|
<p class="is-size-5 has-text-weight-bold">cypress-plugin-snapshots</p>
|
||||||
</header>
|
</header>
|
||||||
<section class="media-content">
|
<section class="media-content">
|
||||||
<p>Plugin for snapshot tests in Cypress.io .</p>
|
<p>Plugin for snapshot tests in Cypress.io.</p>
|
||||||
</section>
|
</section>
|
||||||
<footer>
|
<footer>
|
||||||
<a href="https://github.com/meinaart/cypress-plugin-snapshots" target="_blank" rel="noopener"
|
<a href="https://github.com/meinaart/cypress-plugin-snapshots" target="_blank" rel="noopener"
|
||||||
|
|
@ -335,13 +286,14 @@
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="column is-one-quarter-widescreen is-flex">
|
<div class="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
<p class="is-size-5 has-text-weight-bold">git-explorer</p>
|
<p class="is-size-5 has-text-weight-bold">git-explorer</p>
|
||||||
</header>
|
</header>
|
||||||
<section class="media-content">
|
<section class="media-content">
|
||||||
<p>Offline-first support for previewing and comparing branches in a local git repository.</p>
|
<p>Offline-first support for previewing local git repositories.</p>
|
||||||
</section>
|
</section>
|
||||||
<footer>
|
<footer>
|
||||||
<a href="https://github.com/thescientist13/git-explorer" target="_blank" rel="noopener"
|
<a href="https://github.com/thescientist13/git-explorer" target="_blank" rel="noopener"
|
||||||
|
|
@ -349,34 +301,7 @@
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</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="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
|
|
@ -391,20 +316,7 @@
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</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="column is-one-quarter-widescreen is-flex">
|
||||||
<div class="box is-flex is-fullwidth is-vertical">
|
<div class="box is-flex is-fullwidth is-vertical">
|
||||||
<header>
|
<header>
|
||||||
|
|
@ -419,6 +331,171 @@
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</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>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -433,9 +510,9 @@
|
||||||
<a href="https://gitter.im/rtfpessoa/diff2html" target="_blank" rel="noopener" rel="noreferrer">Gitter</a>.
|
<a href="https://gitter.im/rtfpessoa/diff2html" target="_blank" rel="noopener" rel="noreferrer">Gitter</a>.
|
||||||
Need any help?
|
Need any help?
|
||||||
</p>
|
</p>
|
||||||
<a href="https://github.com/rtfpessoa/diff2html#how-to-use" target="_blank" rel="noopener" rel="noreferrer">
|
<a href="https://github.com/rtfpessoa/diff2html#usage" target="_blank" rel="noopener" rel="noreferrer">
|
||||||
Read more in the Docs
|
Read more in the Docs
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-booticon {
|
.hero-booticon {
|
||||||
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
|
font-family:
|
||||||
|
Helvetica Neue,
|
||||||
|
Helvetica,
|
||||||
|
Arial,
|
||||||
|
sans-serif;
|
||||||
margin: 0 auto 30px;
|
margin: 0 auto 30px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
font-size: 8vw;
|
font-size: 8vw;
|
||||||
|
|
@ -42,6 +46,12 @@
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.flex {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
.is-fullwidth {
|
.is-fullwidth {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
|
|
@ -49,3 +59,7 @@
|
||||||
.is-vertical {
|
.is-vertical {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.align-middle {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,5 +4,4 @@ import '../../../main.ts';
|
||||||
import '../../../main.css';
|
import '../../../main.css';
|
||||||
import './index.css';
|
import './index.css';
|
||||||
|
|
||||||
// eslint-disable-next-line no-new
|
|
||||||
new Clipboard(document.getElementsByClassName('clipboard')[0]);
|
new Clipboard(document.getElementsByClassName('clipboard')[0]);
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@
|
||||||
<a href="https://twitter.com/rtfpessoa" target="_blank" rel="noopener" rel="noreferrer">@rtfpessoa</a>.
|
<a href="https://twitter.com/rtfpessoa" target="_blank" rel="noopener" rel="noreferrer">@rtfpessoa</a>.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a class="footer-list-link" href="https://github.com/rtfpessoa/diff2html#how-to-use" target="_blank"
|
<a class="footer-list-link" href="https://github.com/rtfpessoa/diff2html#usage" target="_blank"
|
||||||
rel="noopener" rel="noreferrer">FAQ</a>
|
rel="noopener" rel="noreferrer">FAQ</a>
|
||||||
-
|
-
|
||||||
<a class="footer-list-link" href="https://diff2html.xyz">diff2html</a>
|
<a class="footer-list-link" href="https://diff2html.xyz">diff2html</a>
|
||||||
|
|
@ -102,4 +102,4 @@
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue