breaking-change: De-structured build configs

And also support Multi-Resolution Windows Cursors packages.
This commit is contained in:
Abdulkaiz Khatri
2024-07-01 09:42:58 +05:30
parent 65d81aa6bc
commit b9d526df48
8 changed files with 870 additions and 54 deletions
Executable
+89
View File
@@ -0,0 +1,89 @@
#!/bin/bash
# A script for preparing binaries of BreezeX Cursors, created by Abdulkaiz Khatri.
version="v2.0.1"
error() (
set -o pipefail
"$@" 2> >(sed $'s,.*,\e[31m&\e[m,' >&2)
)
get_config_file() {
local key="${1}"
local cfg_file="build.toml"
if [[ $key == *"Right"* ]]; then
cfg_file="build.right.toml"
fi
echo $cfg_file
}
with_version() {
local comment="${1}"
echo "$comment ($version)"
}
if ! type -p ctgen >/dev/null; then
error ctgen
exit 127 # exit program with "command not found" error code
fi
declare -A names
names["BreezeX-Dark"]=$(with_version "Extended KDE Dark")
names["BreezeX-Black"]=$(with_version "Extended KDE Black")
names["BreezeX-Light"]=$(with_version "Extended KDE Light")
# Cleanup old builds
rm -rf themes bin
# Building BreezeX XCursor binaries
for key in "${!names[@]}"; do
comment="${names[$key]}"
cfg=$(get_config_file key)
ctgen "configs/x.$cfg" -p x11 -d "bitmaps/$key" -n "$key" -c "$comment XCursors" &
PID=$!
wait $PID
done
# Building BreezeX Windows binaries
for key in "${!names[@]}"; do
comment="${names[$key]}"
cfg=$(get_config_file key)
ctgen "configs/win_rg.$cfg" -d "bitmaps/$key" -n "$key-Regular" -c "$comment Regular Windows Cursors" &
# ctgen "configs/win_lg.$cfg" -d "bitmaps/$key" -n "$key-Large" -c "$comment Large Windows Cursors" &
# ctgen "configs/win_xl.$cfg" -d "bitmaps/$key" -n "$key-Extra-Large" -c "$comment Extra Large Windows Cursors" &
PID=$!
wait $PID
done
# Compressing Binaries
mkdir -p bin
cd themes || exit
for key in "${!names[@]}"; do
tar -cJvf "../bin/${key}.tar.xz" "${key}" &
PID=$!
wait $PID
done
# Compressing BreezeX.tar.xz
cp ../LICENSE .
tar -cJvf "../bin/BreezeX.tar.xz" --exclude="*-Windows" . &
PID=$!
wait $PID
# Compressing BreezeX-*-Windows
for key in "${!names[@]}"; do
zip -rv "../bin/${key}-Windows.zip" "${key}-Regular-Windows" "${key}-Large-Windows" "${key}-Extra-Large-Windows" &
PID=$!
wait $PID
done
cd ..
# Copying License File for 'bitmaps'
cp LICENSE bitmaps/
zip -rv bin/bitmaps.zip bitmaps
+124
View File
@@ -0,0 +1,124 @@
[theme]
name = 'BreezeX-Large'
comment = 'Extended KDE Large Windows Cursor'
website = 'https://www.github.com/ful1e5/BreezeX_Cursor'
[config]
bitmaps_dir = '' # This config will assigned with `ctgen -d <path>`
out_dir = '../themes'
platforms = 'windows'
[cursors]
[cursors.fallback_settings]
win_sizes = ["26:32", "39:48", "52:64", "77:96", "103:128"]
x_hotspot = 128
y_hotspot = 128
win_delay = 1
[cursors.all-scroll]
png = 'all-scroll.png'
win_name = 'Move'
[cursors.bd_double_arrow]
png = 'bd_double_arrow.png'
x_hotspot = 127
y_hotspot = 124
win_name = 'Dng1'
[cursors.cross]
png = 'cross.png'
win_name = 'Cross'
[cursors.dnd_no_drop]
png = 'dnd_no_drop.png'
win_name = 'Unavailiable'
[cursors.fd_double_arrow]
png = 'fd_double_arrow.png'
x_hotspot = 126
y_hotspot = 125
win_name = 'Dng2'
[cursors.hand1]
png = 'hand1.png'
x_hotspot = 144
y_hotspot = 90
win_name = 'Pan'
[cursors.hand2]
png = 'hand2.png'
x_hotspot = 117
y_hotspot = 36
win_name = 'Link'
[cursors.move]
png = 'move.png'
x_hotspot = 141
y_hotspot = 79
win_name = 'Grabbing'
[cursors.left_ptr]
png = 'left_ptr.png'
x_hotspot = 69
y_hotspot = 30
win_name = 'Pointer'
[cursors.left_ptr_watch]
png = 'left_ptr_watch-*.png'
x_hotspot = 69
y_hotspot = 30
win_sizes = "78:96"
win_name = 'Work'
[cursors.pencil]
png = 'pencil.png'
x_hotspot = 40
y_hotspot = 210
win_name = 'Handwriting'
[cursors.question_arrow]
png = 'question_arrow.png'
x_hotspot = 69
y_hotspot = 30
win_name = 'Help'
[cursors.right_ptr]
png = 'right_ptr.png'
x_hotspot = 181
y_hotspot = 30
win_name = 'Alternate'
[cursors.sb_h_double_arrow]
png = 'sb_h_double_arrow.png'
x_hotspot = 127
y_hotspot = 125
win_name = 'Horz'
[cursors.sb_v_double_arrow]
png = 'sb_v_double_arrow.png'
x_hotspot = 126
y_hotspot = 125
win_name = 'Vert'
[cursors.wait]
png = 'wait-*.png'
win_sizes = "78:96"
win_name = 'Busy'
[cursors.xterm]
png = 'xterm.png'
win_name = 'Text'
[cursors.zoom-in]
png = 'zoom-in.png'
x_hotspot = 109
y_hotspot = 103
win_name = 'Zoom-in'
[cursors.zoom-out]
png = 'zoom-out.png'
x_hotspot = 109
y_hotspot = 103
win_name = 'Zoom-out'
+124
View File
@@ -0,0 +1,124 @@
[theme]
name = 'BreezeX-Regular'
comment = 'Extended KDE Regular Windows Cursor'
website = 'https://www.github.com/ful1e5/BreezeX_Cursor'
[config]
bitmaps_dir = '' # This config will assigned with `ctgen -d <path>`
out_dir = '../themes'
platforms = 'windows'
[cursors]
[cursors.fallback_settings]
win_sizes = ["22:32", "32:48", "43:64", "64:96", "86:128"]
x_hotspot = 128
y_hotspot = 128
win_delay = 1
[cursors.all-scroll]
png = 'all-scroll.png'
win_name = 'Move'
[cursors.bd_double_arrow]
png = 'bd_double_arrow.png'
x_hotspot = 127
y_hotspot = 124
win_name = 'Dng1'
[cursors.cross]
png = 'cross.png'
win_name = 'Cross'
[cursors.dnd_no_drop]
png = 'dnd_no_drop.png'
win_name = 'Unavailiable'
[cursors.fd_double_arrow]
png = 'fd_double_arrow.png'
x_hotspot = 126
y_hotspot = 125
win_name = 'Dng2'
[cursors.hand1]
png = 'hand1.png'
x_hotspot = 144
y_hotspot = 90
win_name = 'Pan'
[cursors.hand2]
png = 'hand2.png'
x_hotspot = 117
y_hotspot = 36
win_name = 'Link'
[cursors.move]
png = 'move.png'
x_hotspot = 141
y_hotspot = 79
win_name = 'Grabbing'
[cursors.left_ptr]
png = 'left_ptr.png'
x_hotspot = 69
y_hotspot = 30
win_name = 'Pointer'
[cursors.left_ptr_watch]
png = 'left_ptr_watch-*.png'
x_hotspot = 69
y_hotspot = 30
win_sizes = "64:96"
win_name = 'Work'
[cursors.pencil]
png = 'pencil.png'
x_hotspot = 40
y_hotspot = 210
win_name = 'Handwriting'
[cursors.question_arrow]
png = 'question_arrow.png'
x_hotspot = 69
y_hotspot = 30
win_name = 'Help'
[cursors.right_ptr]
png = 'right_ptr.png'
x_hotspot = 181
y_hotspot = 30
win_name = 'Alternate'
[cursors.sb_h_double_arrow]
png = 'sb_h_double_arrow.png'
x_hotspot = 127
y_hotspot = 125
win_name = 'Horz'
[cursors.sb_v_double_arrow]
png = 'sb_v_double_arrow.png'
x_hotspot = 126
y_hotspot = 125
win_name = 'Vert'
[cursors.wait]
png = 'wait-*.png'
win_sizes = "64:96"
win_name = 'Busy'
[cursors.xterm]
png = 'xterm.png'
win_name = 'Text'
[cursors.zoom-in]
png = 'zoom-in.png'
x_hotspot = 109
y_hotspot = 103
win_name = 'Zoom-in'
[cursors.zoom-out]
png = 'zoom-out.png'
x_hotspot = 109
y_hotspot = 103
win_name = 'Zoom-out'
+124
View File
@@ -0,0 +1,124 @@
[theme]
name = 'BreezeX-Extra-Large'
comment = 'Extended KDE Extra Large Windows Cursor'
website = 'https://www.github.com/ful1e5/BreezeX_Cursor'
[config]
bitmaps_dir = '' # This config will assigned with `ctgen -d <path>`
out_dir = '../themes'
platforms = 'windows'
[cursors]
[cursors.fallback_settings]
win_sizes = [32, 48, 64, 96, 128]
x_hotspot = 128
y_hotspot = 128
win_delay = 1
[cursors.all-scroll]
png = 'all-scroll.png'
win_name = 'Move'
[cursors.bd_double_arrow]
png = 'bd_double_arrow.png'
x_hotspot = 127
y_hotspot = 124
win_name = 'Dng1'
[cursors.cross]
png = 'cross.png'
win_name = 'Cross'
[cursors.dnd_no_drop]
png = 'dnd_no_drop.png'
win_name = 'Unavailiable'
[cursors.fd_double_arrow]
png = 'fd_double_arrow.png'
x_hotspot = 126
y_hotspot = 125
win_name = 'Dng2'
[cursors.hand1]
png = 'hand1.png'
x_hotspot = 144
y_hotspot = 90
win_name = 'Pan'
[cursors.hand2]
png = 'hand2.png'
x_hotspot = 117
y_hotspot = 36
win_name = 'Link'
[cursors.move]
png = 'move.png'
x_hotspot = 141
y_hotspot = 79
win_name = 'Grabbing'
[cursors.left_ptr]
png = 'left_ptr.png'
x_hotspot = 69
y_hotspot = 30
win_name = 'Pointer'
[cursors.left_ptr_watch]
png = 'left_ptr_watch-*.png'
x_hotspot = 69
y_hotspot = 30
win_sizes = 96
win_name = 'Work'
[cursors.pencil]
png = 'pencil.png'
x_hotspot = 40
y_hotspot = 210
win_name = 'Handwriting'
[cursors.question_arrow]
png = 'question_arrow.png'
x_hotspot = 69
y_hotspot = 30
win_name = 'Help'
[cursors.right_ptr]
png = 'right_ptr.png'
x_hotspot = 181
y_hotspot = 30
win_name = 'Alternate'
[cursors.sb_h_double_arrow]
png = 'sb_h_double_arrow.png'
x_hotspot = 127
y_hotspot = 125
win_name = 'Horz'
[cursors.sb_v_double_arrow]
png = 'sb_v_double_arrow.png'
x_hotspot = 126
y_hotspot = 125
win_name = 'Vert'
[cursors.wait]
png = 'wait-*.png'
win_sizes = 96
win_name = 'Busy'
[cursors.xterm]
png = 'xterm.png'
win_name = 'Text'
[cursors.zoom-in]
png = 'zoom-in.png'
x_hotspot = 109
y_hotspot = 103
win_name = 'Zoom-in'
[cursors.zoom-out]
png = 'zoom-out.png'
x_hotspot = 109
y_hotspot = 103
win_name = 'Zoom-out'
+377
View File
@@ -0,0 +1,377 @@
[theme]
name = 'BreezeX Cursor'
comment = 'Extended KDE XCursor'
website = 'https://www.github.com/ful1e5/BreezeX_Cursor'
[config]
bitmaps_dir = '' # This config will assigned with `ctgen -d <path>`
out_dir = '../themes'
platforms = 'x11'
[cursors]
[cursors.fallback_settings]
x11_sizes = [16, 20, 22, 24, 28, 32, 40, 48, 56, 64, 72, 80, 88, 96]
x_hotspot = 128
y_hotspot = 128
x11_delay = 10
[cursors.all-scroll]
png = 'all-scroll.png'
x11_name = 'all-scroll'
x11_symlinks = ["fleur", "size_all"]
[cursors.bd_double_arrow]
png = 'bd_double_arrow.png'
x_hotspot = 127
y_hotspot = 124
x11_name = 'bd_double_arrow'
win_name = 'Diagonal_1'
x11_symlinks = [
"c7088f0f3e6c8088236ef8e1e3e70000",
"nw-resize",
"nwse-resize",
"size_fdiag",
"se-resize",
]
[cursors.bottom_left_corner]
png = 'bottom_left_corner.png'
x_hotspot = 61
y_hotspot = 190
x11_name = 'bottom_left_corner'
[cursors.bottom_right_corner]
png = 'bottom_right_corner.png'
x_hotspot = 190
y_hotspot = 190
x11_name = 'bottom_right_corner'
[cursors.bottom_side]
png = 'bottom_side.png'
x_hotspot = 128
y_hotspot = 212
x11_name = 'bottom_side'
[cursors.center_ptr]
png = 'center_ptr.png'
x_hotspot = 128
y_hotspot = 30
x11_name = 'center_ptr'
[cursors.col-resize]
png = 'col-resize.png'
x11_name = 'col-resize'
x11_symlinks = ["split_h"]
[cursors.color-picker]
png = 'color-picker.png'
x_hotspot = 50
y_hotspot = 205
x11_name = 'color-picker'
[cursors.context-menu]
png = 'context-menu.png'
x_hotspot = 69
y_hotspot = 30
x11_name = 'context-menu'
[cursors.copy]
png = 'copy.png'
x_hotspot = 69
y_hotspot = 30
x11_name = 'copy'
x11_symlinks = [
"1081e37283d90000800003c07f3ef6bf",
"6407b0e94181790501fd1e167b474872",
"b66166c04f8c3109214a4fbd64a50fc8",
"dnd-copy",
]
[cursors.cross]
png = 'cross.png'
x11_name = 'cross'
win_name = 'Cross'
x11_symlinks = ["cross_reverse", "diamond_cross", "tcross", "crosshair"]
[cursors.crossed_circle]
png = 'crossed_circle.png'
x_hotspot = 69
y_hotspot = 30
x11_name = 'crossed_circle'
x11_symlinks = ["forbidden", "not-allowed"]
[cursors.dnd_no_drop]
png = 'dnd_no_drop.png'
x11_name = 'dnd_no_drop'
win_name = 'Unavailiable'
x11_symlinks = [
"03b6e0fcb3499374a867c041f52298f0",
"circle",
"dnd-no-drop",
"no-drop",
]
[cursors.dotbox]
png = 'dotbox.png'
x11_name = 'dotbox'
x11_symlinks = ["dot_box_mask", "draped_box", "icon", "target"]
[cursors.fd_double_arrow]
png = 'fd_double_arrow.png'
x_hotspot = 126
y_hotspot = 125
x11_name = 'fd_double_arrow'
win_name = 'Diagonal_2'
x11_symlinks = [
"fcf1c3c7cd4491d801f1e1c78f100000",
"ne-resize",
"nesw-resize",
"sw-resize",
"size_bdiag",
]
[cursors.hand1]
png = 'hand1.png'
x_hotspot = 144
y_hotspot = 90
x11_name = 'hand1'
win_name = 'Move'
x11_symlinks = ["grab", "openhand"]
[cursors.hand2]
png = 'hand2.png'
x_hotspot = 117
y_hotspot = 36
x11_name = 'hand2'
win_name = 'Link'
x11_symlinks = [
"9d800788f1b08800ae810202380a0822",
"e29285e634086352946a0e7090d73106",
"pointer",
"pointing_hand",
]
[cursors.left_ptr]
png = 'left_ptr.png'
x_hotspot = 69
y_hotspot = 30
x11_name = 'left_ptr'
win_name = 'Default'
x11_symlinks = ["arrow", "default", "top_left_arrow"]
[cursors.left_ptr_watch]
png = 'left_ptr_watch-*.png'
x_hotspot = 69
y_hotspot = 30
x11_name = 'left_ptr_watch'
win_name = 'Work'
x11_symlinks = [
"00000000000000020006000e7e9ffc3f",
"08e8e1c95fe2fc01f976f1e063a24ccd",
"3ecb610c1bf2410f44200f48c40d3599",
"progress",
]
[cursors.left_side]
png = 'left_side.png'
x_hotspot = 44
y_hotspot = 128
x11_name = 'left_side'
[cursors.link]
png = 'link.png'
x_hotspot = 69
y_hotspot = 30
x11_name = 'link'
x11_symlinks = [
"3085a0e285430894940527032f8b26df",
"640fb0e74195791501fd1ed57b41487f",
"a2a266d0498c3104214a47bd64ab0fc8",
"alias",
"dnd-link",
]
[cursors.move]
png = 'move.png'
x_hotspot = 141
y_hotspot = 79
x11_name = 'move'
x11_symlinks = [
"4498f0e0c1937ffe01fd06f973665830",
"9081237383d90e509aa00f00170e968f",
"fcf21c00b30f7e3f83fe0dfd12e71cff",
"grabbing",
"pointer_move",
"dnd-move",
"closedhand",
"dnd-none",
]
[cursors.pencil]
png = 'pencil.png'
x_hotspot = 40
y_hotspot = 210
x11_name = 'pencil'
win_name = 'Handwriting'
x11_symlinks = ["draft"]
[cursors.pirate]
png = 'pirate.png'
x11_name = 'pirate'
[cursors.plus]
png = 'plus.png'
x11_name = 'plus'
x11_symlinks = ["cell"]
[cursors.question_arrow]
png = 'question_arrow.png'
x_hotspot = 69
y_hotspot = 30
x11_name = 'question_arrow'
win_name = 'Help'
x11_symlinks = [
"5c6cd98b3f3ebcb1f9c7f1c204630408",
"d9ce0ab605698f320427677b458ad60b",
"help",
"left_ptr_help",
"whats_this",
"dnd-ask",
]
[cursors.right_ptr]
png = 'right_ptr.png'
x_hotspot = 181
y_hotspot = 30
x11_name = 'right_ptr'
win_name = 'Alternate'
x11_symlinks = ["draft_large", "draft_small"]
[cursors.right_side]
png = 'right_side.png'
x_hotspot = 211
y_hotspot = 128
x11_name = 'right_side'
[cursors.row-resize]
png = 'row-resize.png'
x11_name = 'row-resize'
x11_symlinks = ["split_v"]
[cursors.sb_down_arrow]
png = 'sb_down_arrow.png'
x_hotspot = 129
y_hotspot = 222
x11_name = 'sb_down_arrow'
x11_symlinks = ["down-arrow"]
[cursors.sb_h_double_arrow]
png = 'sb_h_double_arrow.png'
x_hotspot = 127
y_hotspot = 125
x11_name = 'sb_h_double_arrow'
win_name = 'Horizontal'
x11_symlinks = [
"028006030e0e7ebffc7f7070c0600140",
"14fef782d02440884392942c1120523",
"e-resize",
"ew-resize",
"h_double_arrow",
"size-hor",
"size_hor",
"w-resize",
]
[cursors.sb_left_arrow]
png = 'sb_left_arrow.png'
x_hotspot = 35
y_hotspot = 128
x11_name = 'sb_left_arrow'
x11_symlinks = ["left-arrow"]
[cursors.sb_right_arrow]
png = 'sb_right_arrow.png'
x_hotspot = 222
y_hotspot = 128
x11_name = 'sb_right_arrow'
x11_symlinks = ["right-arrow"]
[cursors.sb_up_arrow]
png = 'sb_up_arrow.png'
x_hotspot = 128
y_hotspot = 36
x11_name = 'sb_up_arrow'
x11_symlinks = ["up-arrow"]
[cursors.sb_v_double_arrow]
png = 'sb_v_double_arrow.png'
x_hotspot = 126
y_hotspot = 125
x11_name = 'sb_v_double_arrow'
win_name = 'Vertical'
x11_symlinks = [
"00008160000006810000408080010102",
"2870a09082c103050810ffdffffe0204",
"double_arrow",
"n-resize",
"ns-resize",
"size-ver",
"size_ver",
"s-resize",
"v_double_arrow",
]
[cursors.top_left_corner]
png = 'top_left_corner.png'
x_hotspot = 61
y_hotspot = 67
x11_name = 'top_left_corner'
[cursors.top_right_corner]
png = 'top_right_corner.png'
x_hotspot = 189
y_hotspot = 65
x11_name = 'top_right_corner'
[cursors.top_side]
png = 'top_side.png'
x_hotspot = 128
y_hotspot = 43
x11_name = 'top_side'
[cursors.vertical-text]
png = 'vertical-text.png'
x11_name = 'vertical-text'
[cursors.wait]
png = 'wait-*.png'
x11_name = 'wait'
win_name = 'Busy'
x11_symlinks = ["watch"]
[cursors.wayland-cursor]
png = 'wayland-cursor.png'
x11_name = 'wayland-cursor'
[cursors.X_cursor]
png = 'X_cursor.png'
x11_name = 'X_cursor'
x11_symlinks = ["x-cursor"]
[cursors.xterm]
png = 'xterm.png'
x11_name = 'xterm'
win_name = 'IBeam'
x11_symlinks = ["ibeam", "text"]
[cursors.zoom-in]
png = 'zoom-in.png'
x_hotspot = 109
y_hotspot = 103
x11_name = 'zoom-in'
[cursors.zoom-out]
png = 'zoom-out.png'
x_hotspot = 109
y_hotspot = 103
x11_name = 'zoom-out'
+6 -1
View File
@@ -2,5 +2,10 @@
"dependencies": { "dependencies": {
"cbmp": "^1.1.1" "cbmp": "^1.1.1"
}, },
"scripts": {} "scripts": {
"clean": "rm -rf bin bitmaps themes",
"render": "npx cbmp render.json",
"build": "bash build.sh",
"generate": "npx cbmp render.json && bash build.sh"
}
} }
-53
View File
@@ -1,53 +0,0 @@
#!/bin/bash
# A script for preparing binaries for version release of BreezeX Cursors, by Abdulkaiz Khatri
declare -A names
names["BreezeX-Dark"]="BreezeX Dark cursors."
names["BreezeX-Black"]="BreezeX Black cursors."
names["BreezeX-Light"]="BreezeX Light cursors."
# Cleanup old builds
rm -rf themes bin
# Building BreezeX XCursor binaries
for key in "${!names[@]}";
do
comment="${names[$key]}";
ctgen build.toml -p x11 -d "bitmaps/$key" -n "$key" -c "$comment" &
PID=$!
wait $PID
done
# Building BreezeX Windows binaries
for key in "${!names[@]}";
do
comment="${names[$key]}";
ctgen build.toml -p windows -s 16 -d "bitmaps/$key" -n "$key-Small" -c "$comment" &
ctgen build.toml -p windows -s 24 -d "bitmaps/$key" -n "$key-Regular" -c "$comment" &
ctgen build.toml -p windows -s 32 -d "bitmaps/$key" -n "$key-Large" -c "$comment" &
ctgen build.toml -p windows -s 48 -d "bitmaps/$key" -n "$key-Extra-Large" -c "$comment" &
PID=$!
wait $PID
done
# Compressing Binaries
mkdir -p bin
cd themes
for key in "${!names[@]}";
do
tar -czvf "../bin/${key}.tar.gz" "${key}" &
PID=$!
wait $PID
done
for key in "${!names[@]}";
do
zip -rv "../bin/${key}-Windows.zip" "${key}-Small-Windows" "${key}-Regular-Windows" "${key}-Large-Windows" "${key}-Extra-Large-Windows" &
PID=$!
wait $PID
done
cd ..
+26
View File
@@ -0,0 +1,26 @@
{
"BreezeX-Dark": {
"dir": "svg",
"out": "bitmaps/BreezeX-Dark",
"colors": [
{ "match": "#00FF00", "replace": "#4D4D4D" },
{ "match": "#0000FF", "replace": "#FFFFFF" }
]
},
"BreezeX-Black": {
"dir": "svg",
"out": "bitmaps/BreezeX-Black",
"colors": [
{ "match": "#00FF00", "replace": "#000000" },
{ "match": "#0000FF", "replace": "#FFFFFF" }
]
},
"BreezeX-Light": {
"dir": "svg",
"out": "bitmaps/BreezeX-Light",
"colors": [
{ "match": "#00FF00", "replace": "#FFFFFF" },
{ "match": "#0000FF", "replace": "#4D4D4D" }
]
}
}