mirror of
https://github.com/neon-mmd/websurfx.git
synced 2024-11-22 14:08:23 -05:00
Merge branch 'rolling' of https://github.com/cybrejon/websurfx into rolling
This commit is contained in:
commit
5ecc1a979a
2
.github/workflows/pr_labeler.yml
vendored
2
.github/workflows/pr_labeler.yml
vendored
@ -9,7 +9,7 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/labeler@v4
|
- uses: actions/labeler@v5
|
||||||
with:
|
with:
|
||||||
sync-labels: true
|
sync-labels: true
|
||||||
dot: true
|
dot: true
|
||||||
|
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
@ -19,7 +19,7 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v8
|
- uses: actions/stale@v9
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
stale-issue-message: 'Stale issue message'
|
stale-issue-message: 'Stale issue message'
|
||||||
|
346
Cargo.lock
generated
346
Cargo.lock
generated
@ -14,7 +14,7 @@ dependencies = [
|
|||||||
"futures-sink",
|
"futures-sink",
|
||||||
"memchr",
|
"memchr",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
@ -65,23 +65,24 @@ checksum = "a2e7b88f3804e01bd4191fdb08650430bbfcb43d3d9b2890064df3551ec7d25b"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"actix-http",
|
"actix-http",
|
||||||
"actix-web",
|
"actix-web",
|
||||||
"futures 0.3.29",
|
"futures 0.3.30",
|
||||||
"governor",
|
"governor",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "actix-http"
|
name = "actix-http"
|
||||||
version = "3.4.0"
|
version = "3.5.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a92ef85799cba03f76e4f7c10f533e66d87c9a7e7055f3391f09000ad8351bc9"
|
checksum = "129d4c88e98860e1758c5de288d1632b07970a16d59bdf7b8d66053d582bb71f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"actix-codec",
|
"actix-codec",
|
||||||
"actix-rt",
|
"actix-rt",
|
||||||
"actix-service",
|
"actix-service",
|
||||||
"actix-utils",
|
"actix-utils",
|
||||||
"ahash 0.8.6",
|
"ahash 0.8.7",
|
||||||
"base64 0.21.5",
|
"base64 0.21.5",
|
||||||
"bitflags 2.4.1",
|
"bitflags 2.4.1",
|
||||||
|
"brotli",
|
||||||
"bytes 1.5.0",
|
"bytes 1.5.0",
|
||||||
"bytestring",
|
"bytestring",
|
||||||
"derive_more",
|
"derive_more",
|
||||||
@ -99,7 +100,7 @@ dependencies = [
|
|||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"sha1",
|
"sha1",
|
||||||
"smallvec 1.11.2",
|
"smallvec 1.11.2",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
@ -111,14 +112,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb"
|
checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "actix-router"
|
name = "actix-router"
|
||||||
version = "0.5.1"
|
version = "0.5.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799"
|
checksum = "d22475596539443685426b6bdadb926ad0ecaefdfc5fb05e5e3441f15463c511"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytestring",
|
"bytestring",
|
||||||
"http 0.2.11",
|
"http 0.2.11",
|
||||||
@ -134,7 +135,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d"
|
checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -149,8 +150,8 @@ dependencies = [
|
|||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"mio 0.8.10",
|
"mio 0.8.10",
|
||||||
"socket2 0.5.5",
|
"socket2",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -177,9 +178,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "actix-web"
|
name = "actix-web"
|
||||||
version = "4.4.0"
|
version = "4.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0e4a5b5e29603ca8c94a77c65cf874718ceb60292c5a5c3e5f4ace041af462b9"
|
checksum = "e43428f3bf11dee6d166b00ec2df4e3aa8cc1606aaa0b7433c146852e2f4e03b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"actix-codec",
|
"actix-codec",
|
||||||
"actix-http",
|
"actix-http",
|
||||||
@ -190,7 +191,7 @@ dependencies = [
|
|||||||
"actix-service",
|
"actix-service",
|
||||||
"actix-utils",
|
"actix-utils",
|
||||||
"actix-web-codegen",
|
"actix-web-codegen",
|
||||||
"ahash 0.8.6",
|
"ahash 0.8.7",
|
||||||
"bytes 1.5.0",
|
"bytes 1.5.0",
|
||||||
"bytestring",
|
"bytestring",
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
@ -210,8 +211,8 @@ dependencies = [
|
|||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_urlencoded 0.7.1",
|
"serde_urlencoded 0.7.1",
|
||||||
"smallvec 1.11.2",
|
"smallvec 1.11.2",
|
||||||
"socket2 0.5.5",
|
"socket2",
|
||||||
"time 0.3.30",
|
"time 0.3.31",
|
||||||
"url 2.5.0",
|
"url 2.5.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -222,9 +223,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5"
|
checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"actix-router",
|
"actix-router",
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -255,9 +256,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ahash"
|
name = "ahash"
|
||||||
version = "0.8.6"
|
version = "0.8.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a"
|
checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"getrandom",
|
"getrandom",
|
||||||
@ -313,9 +314,9 @@ checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyhow"
|
name = "anyhow"
|
||||||
version = "1.0.75"
|
version = "1.0.77"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
|
checksum = "c9d19de80eff169429ac1e9f48fffb163916b448a44e8e046186232046d9e1f9"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arc-swap"
|
name = "arc-swap"
|
||||||
@ -352,7 +353,7 @@ dependencies = [
|
|||||||
"futures-core",
|
"futures-core",
|
||||||
"memchr",
|
"memchr",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -363,13 +364,13 @@ checksum = "9338790e78aa95a416786ec8389546c4b6a1dfc3dc36071ed9518a9413a542eb"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-trait"
|
name = "async-trait"
|
||||||
version = "0.1.74"
|
version = "0.1.76"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
|
checksum = "531b97fb4cd3dfdce92c35dedbfdc1f0b9d8091c8ca943d6dae340ef5012d514"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -489,9 +490,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bstr"
|
name = "bstr"
|
||||||
version = "1.8.0"
|
version = "1.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c"
|
checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
"serde",
|
"serde",
|
||||||
@ -552,9 +553,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cargo-platform"
|
name = "cargo-platform"
|
||||||
version = "0.1.5"
|
version = "0.1.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff"
|
checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
@ -637,18 +638,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.4.11"
|
version = "4.4.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2"
|
checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap_builder",
|
"clap_builder",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_builder"
|
name = "clap_builder"
|
||||||
version = "4.4.11"
|
version = "4.4.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb"
|
checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anstyle",
|
"anstyle",
|
||||||
"clap_lex",
|
"clap_lex",
|
||||||
@ -679,7 +680,7 @@ dependencies = [
|
|||||||
"futures-core",
|
"futures-core",
|
||||||
"memchr",
|
"memchr",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -698,7 +699,7 @@ version = "0.3.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a"
|
checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 1.0.109",
|
"syn 1.0.109",
|
||||||
]
|
]
|
||||||
@ -732,7 +733,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb"
|
checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"percent-encoding 2.3.1",
|
"percent-encoding 2.3.1",
|
||||||
"time 0.3.30",
|
"time 0.3.31",
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -824,12 +825,12 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-channel"
|
name = "crossbeam-channel"
|
||||||
version = "0.5.9"
|
version = "0.5.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "14c3242926edf34aec4ac3a77108ad4854bffaa2e4ddc1824124ce59231302d5"
|
checksum = "82a9b73a36529d9c47029b9fb3a6f0ea3cc916a261195352ba19e770fc1748b2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"crossbeam-utils 0.8.17",
|
"crossbeam-utils 0.8.18",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -882,9 +883,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-utils"
|
name = "crossbeam-utils"
|
||||||
version = "0.8.17"
|
version = "0.8.18"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f"
|
checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
]
|
]
|
||||||
@ -941,7 +942,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
|
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -979,7 +980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
|
checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"convert_case",
|
"convert_case",
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"rustc_version 0.4.0",
|
"rustc_version 0.4.0",
|
||||||
"syn 1.0.109",
|
"syn 1.0.109",
|
||||||
@ -1123,7 +1124,7 @@ version = "0.1.8"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
|
checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 1.0.109",
|
"syn 1.0.109",
|
||||||
"synstructure",
|
"synstructure",
|
||||||
@ -1232,9 +1233,9 @@ checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures"
|
name = "futures"
|
||||||
version = "0.3.29"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335"
|
checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
@ -1247,9 +1248,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-channel"
|
name = "futures-channel"
|
||||||
version = "0.3.29"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb"
|
checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-sink",
|
"futures-sink",
|
||||||
@ -1257,9 +1258,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-core"
|
name = "futures-core"
|
||||||
version = "0.3.29"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"
|
checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-cpupool"
|
name = "futures-cpupool"
|
||||||
@ -1273,9 +1274,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-executor"
|
name = "futures-executor"
|
||||||
version = "0.3.29"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc"
|
checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-task",
|
"futures-task",
|
||||||
@ -1284,32 +1285,32 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-io"
|
name = "futures-io"
|
||||||
version = "0.3.29"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa"
|
checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-macro"
|
name = "futures-macro"
|
||||||
version = "0.3.29"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb"
|
checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-sink"
|
name = "futures-sink"
|
||||||
version = "0.3.29"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817"
|
checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-task"
|
name = "futures-task"
|
||||||
version = "0.3.29"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"
|
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-timer"
|
name = "futures-timer"
|
||||||
@ -1319,9 +1320,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-util"
|
name = "futures-util"
|
||||||
version = "0.3.29"
|
version = "0.3.30"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"
|
checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
@ -1394,7 +1395,7 @@ checksum = "821239e5672ff23e2a7060901fa622950bbd80b649cdaadd78d1c1767ed14eb4"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
"futures 0.3.29",
|
"futures 0.3.30",
|
||||||
"futures-timer",
|
"futures-timer",
|
||||||
"no-std-compat",
|
"no-std-compat",
|
||||||
"nonzero_ext",
|
"nonzero_ext",
|
||||||
@ -1436,7 +1437,7 @@ dependencies = [
|
|||||||
"http 0.2.11",
|
"http 0.2.11",
|
||||||
"indexmap 2.1.0",
|
"indexmap 2.1.0",
|
||||||
"slab",
|
"slab",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
@ -1459,7 +1460,7 @@ version = "0.13.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
|
checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash 0.8.6",
|
"ahash 0.8.7",
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1477,11 +1478,11 @@ checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "home"
|
name = "home"
|
||||||
version = "0.5.5"
|
version = "0.5.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
|
checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"windows-sys 0.48.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1507,7 +1508,7 @@ dependencies = [
|
|||||||
"log",
|
"log",
|
||||||
"mac",
|
"mac",
|
||||||
"markup5ever 0.11.0",
|
"markup5ever 0.11.0",
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 1.0.109",
|
"syn 1.0.109",
|
||||||
]
|
]
|
||||||
@ -1607,9 +1608,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper"
|
name = "hyper"
|
||||||
version = "0.14.27"
|
version = "0.14.28"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
|
checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes 1.5.0",
|
"bytes 1.5.0",
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
@ -1622,8 +1623,8 @@ dependencies = [
|
|||||||
"httpdate",
|
"httpdate",
|
||||||
"itoa 1.0.10",
|
"itoa 1.0.10",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"socket2 0.4.10",
|
"socket2",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
"tracing",
|
"tracing",
|
||||||
"want 0.3.1",
|
"want 0.3.1",
|
||||||
@ -1637,9 +1638,9 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"http 0.2.11",
|
"http 0.2.11",
|
||||||
"hyper 0.14.27",
|
"hyper 0.14.28",
|
||||||
"rustls",
|
"rustls",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
"tokio-rustls",
|
"tokio-rustls",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1725,13 +1726,13 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "is-terminal"
|
name = "is-terminal"
|
||||||
version = "0.4.9"
|
version = "0.4.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
|
checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"hermit-abi",
|
"hermit-abi",
|
||||||
"rustix",
|
"rustix",
|
||||||
"windows-sys 0.48.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1881,9 +1882,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "luajit-src"
|
name = "luajit-src"
|
||||||
version = "210.5.2+113a168"
|
version = "210.5.3+29b0b28"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "823ec7bedb1819b11633bd583ae981b0082db08492b0c3396412b85dd329ffee"
|
checksum = "0c2bb89013916ce5c949f01a1fbd6d435a58e1d980767a791d755911211d792d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"which",
|
"which",
|
||||||
@ -1897,9 +1898,9 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mach2"
|
name = "mach2"
|
||||||
version = "0.4.1"
|
version = "0.4.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8"
|
checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
@ -1960,7 +1961,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "0be95d66c3024ffce639216058e5bae17a83ecaf266ffc6e4d060ad447c9eed2"
|
checksum = "0be95d66c3024ffce639216058e5bae17a83ecaf266ffc6e4d060ad447c9eed2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro-error",
|
"proc-macro-error",
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 1.0.109",
|
"syn 1.0.109",
|
||||||
]
|
]
|
||||||
@ -1973,9 +1974,9 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "2.6.4"
|
version = "2.7.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
|
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memoffset"
|
name = "memoffset"
|
||||||
@ -2018,7 +2019,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "23e0b72e7c9042467008b10279fc732326bd605459ae03bda88825909dd19b56"
|
checksum = "23e0b72e7c9042467008b10279fc732326bd605459ae03bda88825909dd19b56"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
"crossbeam-utils 0.8.17",
|
"crossbeam-utils 0.8.18",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
"skeptic",
|
"skeptic",
|
||||||
"smallvec 1.11.2",
|
"smallvec 1.11.2",
|
||||||
@ -2028,10 +2029,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "minify-js"
|
name = "minify-js"
|
||||||
version = "0.5.6"
|
version = "0.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "22d6c512a82abddbbc13b70609cb2beff01be2c7afff534d6e5e1c85e438fc8b"
|
checksum = "b1fa5546ee8bd66024113e506cabe4230e76635a094c06ea2051b66021dda92e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"aho-corasick 0.7.20",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"parse-js",
|
"parse-js",
|
||||||
]
|
]
|
||||||
@ -2198,9 +2200,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "object"
|
name = "object"
|
||||||
version = "0.32.1"
|
version = "0.32.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
|
checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
@ -2219,9 +2221,9 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl"
|
name = "openssl"
|
||||||
version = "0.10.61"
|
version = "0.10.62"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45"
|
checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.4.1",
|
"bitflags 2.4.1",
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
@ -2238,9 +2240,9 @@ version = "0.1.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
|
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2251,9 +2253,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl-sys"
|
name = "openssl-sys"
|
||||||
version = "0.9.97"
|
version = "0.9.98"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b"
|
checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"libc",
|
"libc",
|
||||||
@ -2328,9 +2330,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "parse-js"
|
name = "parse-js"
|
||||||
version = "0.17.0"
|
version = "0.20.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9ec3b11d443640ec35165ee8f6f0559f1c6f41878d70330fe9187012b5935f02"
|
checksum = "2742b5e32dcb5930447ed9f9e401a7dfd883867fc079c4fac44ae8ba3593710e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick 0.7.20",
|
"aho-corasick 0.7.20",
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
@ -2449,9 +2451,9 @@ checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"phf_generator 0.11.2",
|
"phf_generator 0.11.2",
|
||||||
"phf_shared 0.11.2",
|
"phf_shared 0.11.2",
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2496,9 +2498,9 @@ version = "1.1.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
|
checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2515,9 +2517,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pkg-config"
|
name = "pkg-config"
|
||||||
version = "0.3.27"
|
version = "0.3.28"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
|
checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "powerfmt"
|
name = "powerfmt"
|
||||||
@ -2544,7 +2546,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
|
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro-error-attr",
|
"proc-macro-error-attr",
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 1.0.109",
|
"syn 1.0.109",
|
||||||
"version_check",
|
"version_check",
|
||||||
@ -2556,7 +2558,7 @@ version = "1.0.4"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
|
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
@ -2572,9 +2574,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.70"
|
version = "1.0.71"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
|
checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
@ -2606,7 +2608,7 @@ version = "0.11.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab"
|
checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"crossbeam-utils 0.8.17",
|
"crossbeam-utils 0.8.18",
|
||||||
"libc",
|
"libc",
|
||||||
"mach2",
|
"mach2",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
@ -2631,7 +2633,7 @@ version = "1.0.33"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
|
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2790,21 +2792,21 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redis"
|
name = "redis"
|
||||||
version = "0.23.3"
|
version = "0.24.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4f49cdc0bb3f412bf8e7d1bd90fe1d9eb10bc5c399ba90973c14662a27b3f8ba"
|
checksum = "c580d9cbbe1d1b479e8d67cf9daf6a62c957e6846048408b80b43ac3f6af84cd"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arc-swap",
|
"arc-swap",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"bytes 1.5.0",
|
"bytes 1.5.0",
|
||||||
"combine",
|
"combine",
|
||||||
"futures 0.3.29",
|
"futures 0.3.30",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"itoa 1.0.10",
|
"itoa 1.0.10",
|
||||||
"percent-encoding 2.3.1",
|
"percent-encoding 2.3.1",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"ryu",
|
"ryu",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
"tokio-retry",
|
"tokio-retry",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"url 2.5.0",
|
"url 2.5.0",
|
||||||
@ -2890,9 +2892,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "reqwest"
|
name = "reqwest"
|
||||||
version = "0.11.22"
|
version = "0.11.23"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b"
|
checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-compression",
|
"async-compression",
|
||||||
"base64 0.21.5",
|
"base64 0.21.5",
|
||||||
@ -2903,7 +2905,7 @@ dependencies = [
|
|||||||
"h2 0.3.22",
|
"h2 0.3.22",
|
||||||
"http 0.2.11",
|
"http 0.2.11",
|
||||||
"http-body 0.4.6",
|
"http-body 0.4.6",
|
||||||
"hyper 0.14.27",
|
"hyper 0.14.28",
|
||||||
"hyper-rustls",
|
"hyper-rustls",
|
||||||
"ipnet",
|
"ipnet",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
@ -2918,7 +2920,7 @@ dependencies = [
|
|||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_urlencoded 0.7.1",
|
"serde_urlencoded 0.7.1",
|
||||||
"system-configuration",
|
"system-configuration",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
"tokio-rustls",
|
"tokio-rustls",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
@ -3047,11 +3049,11 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "schannel"
|
name = "schannel"
|
||||||
version = "0.1.22"
|
version = "0.1.23"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88"
|
checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"windows-sys 0.48.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -3066,7 +3068,7 @@ version = "0.18.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "585480e3719b311b78a573db1c9d9c4c1f8010c2dee4cc59c2efe58ea4dbc3e1"
|
checksum = "585480e3719b311b78a573db1c9d9c4c1f8010c2dee4cc59c2efe58ea4dbc3e1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash 0.8.6",
|
"ahash 0.8.7",
|
||||||
"cssparser 0.31.2",
|
"cssparser 0.31.2",
|
||||||
"ego-tree",
|
"ego-tree",
|
||||||
"html5ever 0.26.0",
|
"html5ever 0.26.0",
|
||||||
@ -3176,16 +3178,16 @@ version = "1.0.193"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
|
checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.108"
|
version = "1.0.109"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
|
checksum = "cb0652c533506ad7a2e353cce269330d6afd8bdfb6d75e0ace5b35aacbd7b9e9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itoa 1.0.10",
|
"itoa 1.0.10",
|
||||||
"ryu",
|
"ryu",
|
||||||
@ -3299,16 +3301,6 @@ dependencies = [
|
|||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "socket2"
|
|
||||||
version = "0.4.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
"winapi 0.3.9",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "socket2"
|
name = "socket2"
|
||||||
version = "0.5.5"
|
version = "0.5.5"
|
||||||
@ -3377,7 +3369,7 @@ checksum = "f0f45ed1b65bf9a4bf2f7b7dc59212d1926e9eaf00fa998988e420fd124467c6"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"phf_generator 0.7.24",
|
"phf_generator 0.7.24",
|
||||||
"phf_shared 0.7.24",
|
"phf_shared 0.7.24",
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"string_cache_shared",
|
"string_cache_shared",
|
||||||
]
|
]
|
||||||
@ -3390,7 +3382,7 @@ checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"phf_generator 0.10.0",
|
"phf_generator 0.10.0",
|
||||||
"phf_shared 0.10.0",
|
"phf_shared 0.10.0",
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -3417,18 +3409,18 @@ version = "1.0.109"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
|
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.41"
|
version = "2.0.43"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269"
|
checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
@ -3439,7 +3431,7 @@ version = "0.12.6"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
|
checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 1.0.109",
|
"syn 1.0.109",
|
||||||
"unicode-xid 0.2.4",
|
"unicode-xid 0.2.4",
|
||||||
@ -3484,15 +3476,15 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tempfile"
|
name = "tempfile"
|
||||||
version = "3.8.1"
|
version = "3.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5"
|
checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"fastrand",
|
"fastrand",
|
||||||
"redox_syscall 0.4.1",
|
"redox_syscall 0.4.1",
|
||||||
"rustix",
|
"rustix",
|
||||||
"windows-sys 0.48.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -3525,9 +3517,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "time"
|
name = "time"
|
||||||
version = "0.3.30"
|
version = "0.3.31"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5"
|
checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deranged",
|
"deranged",
|
||||||
"itoa 1.0.10",
|
"itoa 1.0.10",
|
||||||
@ -3545,9 +3537,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "time-macros"
|
name = "time-macros"
|
||||||
version = "0.2.15"
|
version = "0.2.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20"
|
checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"time-core",
|
"time-core",
|
||||||
]
|
]
|
||||||
@ -3598,9 +3590,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "1.35.0"
|
version = "1.35.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c"
|
checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace",
|
"backtrace",
|
||||||
"bytes 1.5.0",
|
"bytes 1.5.0",
|
||||||
@ -3610,7 +3602,7 @@ dependencies = [
|
|||||||
"parking_lot 0.12.1",
|
"parking_lot 0.12.1",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"signal-hook-registry",
|
"signal-hook-registry",
|
||||||
"socket2 0.5.5",
|
"socket2",
|
||||||
"tokio-macros",
|
"tokio-macros",
|
||||||
"windows-sys 0.48.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
@ -3663,9 +3655,9 @@ version = "2.2.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
|
checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -3695,7 +3687,7 @@ checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"pin-project",
|
"pin-project",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -3705,7 +3697,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
|
checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rustls",
|
"rustls",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -3771,7 +3763,7 @@ dependencies = [
|
|||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-sink",
|
"futures-sink",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -4001,9 +3993,9 @@ dependencies = [
|
|||||||
"bumpalo",
|
"bumpalo",
|
||||||
"log",
|
"log",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -4035,9 +4027,9 @@ version = "0.2.89"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
|
checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
"wasm-bindgen-backend",
|
"wasm-bindgen-backend",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
@ -4066,7 +4058,7 @@ checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "websurfx"
|
name = "websurfx"
|
||||||
version = "1.6.3"
|
version = "1.7.3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"actix-cors",
|
"actix-cors",
|
||||||
"actix-files",
|
"actix-files",
|
||||||
@ -4080,7 +4072,7 @@ dependencies = [
|
|||||||
"env_logger",
|
"env_logger",
|
||||||
"error-stack",
|
"error-stack",
|
||||||
"fake-useragent",
|
"fake-useragent",
|
||||||
"futures 0.3.29",
|
"futures 0.3.30",
|
||||||
"lightningcss",
|
"lightningcss",
|
||||||
"log",
|
"log",
|
||||||
"maud",
|
"maud",
|
||||||
@ -4090,14 +4082,14 @@ dependencies = [
|
|||||||
"mlua",
|
"mlua",
|
||||||
"redis",
|
"redis",
|
||||||
"regex",
|
"regex",
|
||||||
"reqwest 0.11.22",
|
"reqwest 0.11.23",
|
||||||
"rusty-hook",
|
"rusty-hook",
|
||||||
"scraper",
|
"scraper",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"smallvec 1.11.2",
|
"smallvec 1.11.2",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"tokio 1.35.0",
|
"tokio 1.35.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -4319,20 +4311,20 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zerocopy"
|
name = "zerocopy"
|
||||||
version = "0.7.31"
|
version = "0.7.32"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d"
|
checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"zerocopy-derive",
|
"zerocopy-derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zerocopy-derive"
|
name = "zerocopy-derive"
|
||||||
version = "0.7.31"
|
version = "0.7.32"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a"
|
checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.70",
|
"proc-macro2 1.0.71",
|
||||||
"quote 1.0.33",
|
"quote 1.0.33",
|
||||||
"syn 2.0.41",
|
"syn 2.0.43",
|
||||||
]
|
]
|
||||||
|
12
Cargo.toml
12
Cargo.toml
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "websurfx"
|
name = "websurfx"
|
||||||
version = "1.6.3"
|
version = "1.7.3"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "An open-source alternative to Searx that provides clean, ad-free, and organic results with incredible speed while keeping privacy and security in mind."
|
description = "An open-source alternative to Searx that provides clean, ad-free, and organic results with incredible speed while keeping privacy and security in mind."
|
||||||
repository = "https://github.com/neon-mmd/websurfx"
|
repository = "https://github.com/neon-mmd/websurfx"
|
||||||
@ -16,20 +16,20 @@ path = "src/bin/websurfx.rs"
|
|||||||
reqwest = {version="0.11.22", default-features=false, features=["rustls-tls","brotli", "gzip"]}
|
reqwest = {version="0.11.22", default-features=false, features=["rustls-tls","brotli", "gzip"]}
|
||||||
tokio = {version="1.32.0",features=["rt-multi-thread","macros"], default-features = false}
|
tokio = {version="1.32.0",features=["rt-multi-thread","macros"], default-features = false}
|
||||||
serde = {version="1.0.190", default-features=false, features=["derive"]}
|
serde = {version="1.0.190", default-features=false, features=["derive"]}
|
||||||
serde_json = {version="1.0.108", default-features=false}
|
serde_json = {version="1.0.109", default-features=false}
|
||||||
maud = {version="0.25.0", default-features=false, features=["actix-web"]}
|
maud = {version="0.25.0", default-features=false, features=["actix-web"]}
|
||||||
scraper = {version="0.18.1", default-features = false}
|
scraper = {version="0.18.1", default-features = false}
|
||||||
actix-web = {version="4.4.0", features = ["cookies", "macros"], default-features=false}
|
actix-web = {version="4.4.0", features = ["cookies", "macros", "compress-brotli"], default-features=false}
|
||||||
actix-files = {version="0.6.2", default-features=false}
|
actix-files = {version="0.6.2", default-features=false}
|
||||||
actix-cors = {version="0.6.4", default-features=false}
|
actix-cors = {version="0.6.4", default-features=false}
|
||||||
fake-useragent = {version="0.1.3", default-features=false}
|
fake-useragent = {version="0.1.3", default-features=false}
|
||||||
env_logger = {version="0.10.0", default-features=false}
|
env_logger = {version="0.10.0", default-features=false}
|
||||||
log = {version="0.4.20", default-features=false}
|
log = {version="0.4.20", default-features=false}
|
||||||
mlua = {version="0.9.1", features=["luajit", "vendored"], default-features=false}
|
mlua = {version="0.9.1", features=["luajit", "vendored"], default-features=false}
|
||||||
redis = {version="0.23.3", features=["tokio-comp","connection-manager"], default-features = false, optional = true}
|
redis = {version="0.24.0", features=["tokio-comp","connection-manager"], default-features = false, optional = true}
|
||||||
blake3 = {version="1.5.0", default-features=false}
|
blake3 = {version="1.5.0", default-features=false}
|
||||||
error-stack = {version="0.4.0", default-features=false, features=["std"]}
|
error-stack = {version="0.4.0", default-features=false, features=["std"]}
|
||||||
async-trait = {version="0.1.73", default-features=false}
|
async-trait = {version="0.1.76", default-features=false}
|
||||||
regex = {version="1.9.4", features=["perf"], default-features = false}
|
regex = {version="1.9.4", features=["perf"], default-features = false}
|
||||||
smallvec = {version="1.11.0", features=["union", "serde"], default-features=false}
|
smallvec = {version="1.11.0", features=["union", "serde"], default-features=false}
|
||||||
futures = {version="0.3.28", default-features=false}
|
futures = {version="0.3.28", default-features=false}
|
||||||
@ -46,7 +46,7 @@ tempfile = {version="3.8.0", default-features=false}
|
|||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
lightningcss = {version="1.0.0-alpha.50", default-features=false, features=["grid"]}
|
lightningcss = {version="1.0.0-alpha.50", default-features=false, features=["grid"]}
|
||||||
minify-js = {version="0.5.6", default-features=false}
|
minify-js = {version="0.6.0", default-features=false}
|
||||||
|
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
opt-level = 0
|
opt-level = 0
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM --platform=$BUILDPLATFORM rust:1.74.0-alpine3.18 AS chef
|
FROM --platform=$BUILDPLATFORM rust:1.75.0-alpine3.18 AS chef
|
||||||
# We only pay the installation cost once,
|
# We only pay the installation cost once,
|
||||||
# it will be cached from the second build onwards
|
# it will be cached from the second build onwards
|
||||||
RUN apk add --no-cache alpine-sdk musl-dev g++ make libcrypto3 libressl-dev upx perl build-base
|
RUN apk add --no-cache alpine-sdk musl-dev g++ make libcrypto3 libressl-dev upx perl build-base
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# Create Builder image
|
# Create Builder image
|
||||||
FROM --platform=$BUILDPLATFORM rust:1.74.0-alpine3.18
|
FROM --platform=$BUILDPLATFORM rust:1.75.0-alpine3.18
|
||||||
|
|
||||||
# Install required dependencies
|
# Install required dependencies
|
||||||
RUN apk add --no-cache alpine-sdk musl-dev g++ make libcrypto3 libressl-dev perl build-base
|
RUN apk add --no-cache alpine-sdk musl-dev g++ make libcrypto3 libressl-dev perl build-base
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
If you have built `websurfx` from the source then the configuration file will be located under the project directory (codebase) at `websurfx/`
|
If you have built `websurfx` from the source then the configuration file will be located under the project directory (codebase) at `websurfx/`
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> If you have built websurfx with an unstable/rolling/edge branch then you can copy the configuration file from `websurfx/config.lua` located under the project directory (codebase) to `~/.config/websurfx/` and make the changes there and rerun the websurfx server. _This is only available from unstable/rolling/edge version_.
|
> If you have built websurfx with an unstable/rolling/edge branch then you can copy the configuration file from `websurfx/config.lua` located under the project directory (codebase) to `~/.config/websurfx/` and make the changes there and rerun the websurfx server. _This is only available from unstable/rolling/edge version_.
|
||||||
|
|
||||||
## Installed From Package
|
## Installed From Package
|
||||||
@ -48,7 +48,7 @@ Some of the configuration options provided in the file are stated below. These a
|
|||||||
|
|
||||||
## Website
|
## Website
|
||||||
|
|
||||||
- **colorscheme:** The colorscheme name which should be used for the website theme (the name should be by the colorscheme file name present in the `public/static/colorschemes` folder).
|
- **colorscheme:** The colorscheme name which should be used for the website theme (the name should be by the colorscheme file name present in the `public/static/colorschemes` folder).
|
||||||
|
|
||||||
> By Default we provide 12 colorschemes to choose from these are:
|
> By Default we provide 12 colorschemes to choose from these are:
|
||||||
>
|
>
|
||||||
@ -71,6 +71,12 @@ Some of the configuration options provided in the file are stated below. These a
|
|||||||
>
|
>
|
||||||
> 1. simple
|
> 1. simple
|
||||||
|
|
||||||
|
- **animation:** The animation name that should be used for the website (again, the name should be by the animation file name present in the `public/static/animations` folder).
|
||||||
|
|
||||||
|
> By Default we provide 1 animation to choose from these are:
|
||||||
|
>
|
||||||
|
> 1. simple-frosted-glow
|
||||||
|
|
||||||
## Cache
|
## Cache
|
||||||
|
|
||||||
- **redis_url:** Redis connection URL address on which the client should connect.
|
- **redis_url:** Redis connection URL address on which the client should connect.
|
||||||
@ -78,6 +84,8 @@ Some of the configuration options provided in the file are stated below. These a
|
|||||||
> **Note**
|
> **Note**
|
||||||
> This option can be commented out if you have compiled the app without the `redis-cache` feature. For more information, See [**building**](./building.md).
|
> This option can be commented out if you have compiled the app without the `redis-cache` feature. For more information, See [**building**](./building.md).
|
||||||
|
|
||||||
|
- **cache_expiry_time:** The maximum time the server will store the cache for, after which it flushs/removes/expires/invalidates the cached results. (value provided to this option should be in seconds and the value should be greater than or equal to 60 seconds).
|
||||||
|
|
||||||
## Search Engines
|
## Search Engines
|
||||||
|
|
||||||
- **upstream_search_engines:** Select from the different upstream search engines from which the results should be fetched.
|
- **upstream_search_engines:** Select from the different upstream search engines from which the results should be fetched.
|
||||||
|
@ -12,7 +12,7 @@ This page of the docs outlines how to get **Websurfx** up and running in a devel
|
|||||||
- [NixOS Dev Shell using Nix Flake](#nixos-dev-shell-using-nix-flake-)
|
- [NixOS Dev Shell using Nix Flake](#nixos-dev-shell-using-nix-flake-)
|
||||||
- [Local Development with Docker Compose](#local-development-with-docker-compose-)
|
- [Local Development with Docker Compose](#local-development-with-docker-compose-)
|
||||||
- [Project Commands](#project-commands)
|
- [Project Commands](#project-commands)
|
||||||
+ - [Environment Variables](#environment-variables)
|
- [Environment Variables](#environment-variables)
|
||||||
- [Git Strategy](#git-strategy)
|
- [Git Strategy](#git-strategy)
|
||||||
- [Flow](#git-flow)
|
- [Flow](#git-flow)
|
||||||
- [Branches](#git-branch-naming)
|
- [Branches](#git-branch-naming)
|
||||||
@ -57,7 +57,7 @@ $ npm i -g stylelint
|
|||||||
$ npm i -g stylelint stylelint-config-standard postcss-lit
|
$ npm i -g stylelint stylelint-config-standard postcss-lit
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
||||||
|
|
||||||
- `Cargo-watch` installed on your system which will allow you to auto-build the project when any checks occur in the source code files in the codebase (`websurfx` directory). Before you install `cargo-watch` on your system, make sure you have `cargo` installed on your system. To install `cargo-watch` run the following command:
|
- `Cargo-watch` installed on your system which will allow you to auto-build the project when any checks occur in the source code files in the codebase (`websurfx` directory). Before you install `cargo-watch` on your system, make sure you have `cargo` installed on your system. To install `cargo-watch` run the following command:
|
||||||
@ -69,7 +69,7 @@ cargo install cargo-watch
|
|||||||
- `Git` installed on your system. The installation instructions for this can be found [here](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).
|
- `Git` installed on your system. The installation instructions for this can be found [here](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).
|
||||||
- Finally, The latest version of `Docker` is installed on your system which will be used to avoid introducing unexpected issues when working on the project. The installation instructions for this can be found [here](https://docs.docker.com/engine/install/).
|
- Finally, The latest version of `Docker` is installed on your system which will be used to avoid introducing unexpected issues when working on the project. The installation instructions for this can be found [here](https://docs.docker.com/engine/install/).
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> For **rolling release Linux distributions (distros)**, the above-mentioned required packages except for `stylelint` and `cargo-watch` can also be installed via the distro-specific package manager.
|
> For **rolling release Linux distributions (distros)**, the above-mentioned required packages except for `stylelint` and `cargo-watch` can also be installed via the distro-specific package manager.
|
||||||
>
|
>
|
||||||
> **For Example:**
|
> **For Example:**
|
||||||
@ -149,7 +149,7 @@ Once you have finished running the above command, Websurfx should now be served
|
|||||||
|
|
||||||
This section covers how to use and set up the Gitpod development environment for working on the project.
|
This section covers how to use and set up the Gitpod development environment for working on the project.
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> By default the project only supports the Vscode **IDE/Editor** for Gitpod.
|
> By default the project only supports the Vscode **IDE/Editor** for Gitpod.
|
||||||
|
|
||||||
#### Launching Gitpod
|
#### Launching Gitpod
|
||||||
@ -310,13 +310,13 @@ Before you start working on the project. You will need the following packages in
|
|||||||
$ npm i -g stylelint
|
$ npm i -g stylelint
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
||||||
|
|
||||||
- `Git` installed on your system. The installation instructions for this can be found [here](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).
|
- `Git` installed on your system. The installation instructions for this can be found [here](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).
|
||||||
- Finally, The latest version of `Docker` is installed on your system which will be used to avoid introducing unexpected issues when working on the project. The installation instructions for this can be found [here](https://docs.docker.com/engine/install/).
|
- Finally, The latest version of `Docker` is installed on your system which will be used to avoid introducing unexpected issues when working on the project. The installation instructions for this can be found [here](https://docs.docker.com/engine/install/).
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> For **rolling release Linux distributions (distros)**, the above-mentioned all required packages can also be installed via the distro-specific package manager.
|
> For **rolling release Linux distributions (distros)**, the above-mentioned all required packages can also be installed via the distro-specific package manager.
|
||||||
>
|
>
|
||||||
> **For Example:**
|
> **For Example:**
|
||||||
@ -355,7 +355,7 @@ If you have followed the above section then you should have a cloned repository
|
|||||||
$ docker compose -f dev.docker-compose.yml up
|
$ docker compose -f dev.docker-compose.yml up
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
||||||
|
|
||||||
Once you have finished running the above command, Websurfx should now be served on the address http://127.0.0.1:8080. Hot reload is enabled, so making changes to any of the files will trigger the project to be rebuilt.
|
Once you have finished running the above command, Websurfx should now be served on the address http://127.0.0.1:8080. Hot reload is enabled, so making changes to any of the files will trigger the project to be rebuilt.
|
||||||
@ -366,13 +366,12 @@ Once you have finished running the above command, Websurfx should now be served
|
|||||||
|
|
||||||
- `cargo build`: Builds the project.
|
- `cargo build`: Builds the project.
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> When you build the project first time with the above command it will require the app to compile every dependency in the project which will then be cached on your system. So when you compile the app next time it will only compile for the new changes.
|
> When you build the project first time with the above command it will require the app to compile every dependency in the project which will then be cached on your system. So when you compile the app next time it will only compile for the new changes.
|
||||||
|
|
||||||
+ `cargo run`: Starts the app and serves the project on http://127.0.0.1:8080.
|
- `cargo run`: Starts the app and serves the project on http://127.0.0.1:8080.
|
||||||
|
|
||||||
|
> [!Important]
|
||||||
> **Important**
|
|
||||||
> You must run the build command first.
|
> You must run the build command first.
|
||||||
|
|
||||||
#### Development
|
#### Development
|
||||||
@ -458,10 +457,10 @@ When you submit your pull request, include the required info, by filling out the
|
|||||||
- If any dependencies were added, explain why it was needed, and state the cost. associated, and confirm it does not introduce any security, privacy, or speed issues
|
- If any dependencies were added, explain why it was needed, and state the cost. associated, and confirm it does not introduce any security, privacy, or speed issues
|
||||||
- Optionally, provide a checklist of all the changes that were included in the pull request.
|
- Optionally, provide a checklist of all the changes that were included in the pull request.
|
||||||
|
|
||||||
> **Important**
|
> [!Important]
|
||||||
> Make sure to fill all the required/mandatory sections of the pull request as filling them helps us distinguish between spam pull requests and legitimate pull requests.
|
> Make sure to fill all the required/mandatory sections of the pull request as filling them helps us distinguish between spam pull requests and legitimate pull requests.
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> The pull request template contains comments in the following form `<!-- -->` which are used to provide a guide on what should be provided under each heading of the template. These comments are never rendered when the pull request is either created or updated and hence anything provided in such comments is never displayed.
|
> The pull request template contains comments in the following form `<!-- -->` which are used to provide a guide on what should be provided under each heading of the template. These comments are never rendered when the pull request is either created or updated and hence anything provided in such comments is never displayed.
|
||||||
|
|
||||||
## Resources for Beginners
|
## Resources for Beginners
|
||||||
@ -498,7 +497,7 @@ For Rust, CSS, JS, HTML, Git, and Docker- you'll need an IDE (e.g. [VSCode](http
|
|||||||
|
|
||||||
Linting is done using [Cargo Clippy](https://doc.rust-lang.org/clippy/) and [StyleLint](https://stylelint.io/) or [ESLint](https://eslint.org/). Also, linting is run as a git pre-commit hook.
|
Linting is done using [Cargo Clippy](https://doc.rust-lang.org/clippy/) and [StyleLint](https://stylelint.io/) or [ESLint](https://eslint.org/). Also, linting is run as a git pre-commit hook.
|
||||||
|
|
||||||
> **Important**
|
> [!Important]
|
||||||
> All lint checks must pass before any PR can be merged.
|
> All lint checks must pass before any PR can be merged.
|
||||||
|
|
||||||
Styleguides to follow:
|
Styleguides to follow:
|
||||||
@ -509,7 +508,7 @@ Styleguides to follow:
|
|||||||
|
|
||||||
## Application Structure
|
## Application Structure
|
||||||
|
|
||||||
> **Important**
|
> [!Important]
|
||||||
> We follow the Unix style naming conventions for all the files and folders in the project (except for all files under the `themes` and `colorschemes` folder in the frontend's source code which requires that the names of the files and folders should be in lowercase and the words be separated with a hyphen.) which includes the name of the files and folders should be in lowercase and every word should be separated with an underscore.
|
> We follow the Unix style naming conventions for all the files and folders in the project (except for all files under the `themes` and `colorschemes` folder in the frontend's source code which requires that the names of the files and folders should be in lowercase and the words be separated with a hyphen.) which includes the name of the files and folders should be in lowercase and every word should be separated with an underscore.
|
||||||
|
|
||||||
**Files in the root of the codebase:** `./`
|
**Files in the root of the codebase:** `./`
|
||||||
@ -541,30 +540,42 @@ Styleguides to follow:
|
|||||||
./public/
|
./public/
|
||||||
├── robots.txt # Robots file for the Website.
|
├── robots.txt # Robots file for the Website.
|
||||||
├── images # Images for the Website.
|
├── images # Images for the Website.
|
||||||
├── static # The directory containing all the UI handlers.
|
└── static # The directory containing all the UI handlers.
|
||||||
│ ├── cookies.js # Handles the loading of saved cookies.
|
├── cookies.js # Handles the loading of saved cookies.
|
||||||
│ ├── error_box.js # Handles the toggling functionality of the error box on the search page.
|
├── error_box.js # Handles the toggling functionality of the error box on the search page.
|
||||||
│ ├── index.js # Functions to handle the search functionality of the search bar.
|
├── index.js # Functions to handle the search functionality of the search bar.
|
||||||
│ ├── pagination.js # Functions to handle the navigation between the previous and next page in the search page.
|
├── pagination.js # Functions to handle the navigation between the previous and next page in the search page.
|
||||||
│ ├── search_area_options.js # Changes the search options under the search bar in the search page according to the safe search level set using the URL safesearch parameter.
|
├── search_area_options.js # Changes the search options under the search bar in the search page according to the safe search level set using the URL safesearch parameter.
|
||||||
│ ├── settings.js # Handles the settings and saving of all the settings page options as a cookie.
|
├── settings.js # Handles the settings and saving of all the settings page options as a cookie.
|
||||||
│ ├── colorschemes # A folder containing all the popular colorscheme files as CSS files.
|
├── colorschemes # A folder containing all the popular colorscheme files as CSS files.
|
||||||
│ └── themes # A folder containing all the popular theme files as CSS files.
|
└── themes # A folder containing all the popular theme files as CSS files.
|
||||||
└── templates # Folder containing all the template files for the different pages on the website.
|
```
|
||||||
├── 404.html # A 404-page template.
|
|
||||||
├── about.html # An about page template.
|
**Fronted Maud HTML Framework Source:** `./src/templates/`
|
||||||
├── bar.html # A template for the search bar.
|
|
||||||
├── cookies_tab.html # A template for the cookies tab for the settings page.
|
```
|
||||||
├── engines_tab.html # A template for the engines tab for the settings page.
|
./src/templates/
|
||||||
├── footer.html # A footer template for all pages.
|
├── mod.rs # A module file for the rust project.
|
||||||
├── general_tab.html # A template for the general tab for the settings page.
|
├── partials # A folder containing the code for partials for the views.
|
||||||
├── header.html # A header template for all pages.
|
│ ├── bar.rs # Provides partial code for the search bar.
|
||||||
├── index.html # A home page template.
|
│ ├── footer.rs # Provides partial code for the footer section.
|
||||||
├── navbar.html # A navbar template for the header template.
|
│ ├── header.rs # Provides partial code for the header section.
|
||||||
├── search.html # A search page template.
|
│ ├── mod.rs # A module file for the rust project.
|
||||||
├── search_bar.html # A search bar template specifically for the search page.
|
│ ├── navbar.rs # Provides partial code for the navbar inside the header section.
|
||||||
├── settings.html # A settings page template.
|
│ ├── search_bar.rs # Provides partial code for the search bar present in the search page.
|
||||||
└── user_interface_tab.html # A template for the user interface tab for the settings page.
|
│ └── settings_tabs # A folder containing all the partials for the settings page tabs.
|
||||||
|
│ ├── cookies.rs # Provides partial code for the cookies tab.
|
||||||
|
│ ├── engines.rs # Provides partial code for the engines tab.
|
||||||
|
│ ├── general.rs # Provides partial code for the general tab.
|
||||||
|
│ ├── mod.rs # A module file for the rust project.
|
||||||
|
│ └── user_interface.rs # Provides partial code for the user interface tab.
|
||||||
|
└── views # A folder containing the code for the views.
|
||||||
|
├── about.rs # Provides code for the about page view.
|
||||||
|
├── index.rs # Provides code for the homepage view.
|
||||||
|
├── mod.rs # A module file for the rust project.
|
||||||
|
├── not_found.rs # Provides code for the 404 page view.
|
||||||
|
├── search.rs # Provides code for the search page view.
|
||||||
|
└── settings.rs # Provides code for the settings page view.
|
||||||
```
|
```
|
||||||
|
|
||||||
**Backend Source:** `./src/`
|
**Backend Source:** `./src/`
|
||||||
@ -601,12 +612,13 @@ Styleguides to follow:
|
|||||||
│ ├── aggregator.rs # Provides code aggregate and fetches results from the upstream engines.
|
│ ├── aggregator.rs # Provides code aggregate and fetches results from the upstream engines.
|
||||||
│ ├── mod.rs # A module file for the rust project.
|
│ ├── mod.rs # A module file for the rust project.
|
||||||
│ └── user_agent.rs # Provides a helper function to allow random user agents to pass in the server request code to improve user privacy and avoiding detected as a bot.
|
│ └── user_agent.rs # Provides a helper function to allow random user agents to pass in the server request code to improve user privacy and avoiding detected as a bot.
|
||||||
└── server # A folder that holds code to handle the routes for the search engine website.
|
├── server # A folder that holds code to handle the routes for the search engine website.
|
||||||
├── mod.rs # A module file for the rust project.
|
│ ├── mod.rs # A module file for the rust project.
|
||||||
├── router.rs # Provides functions to handle the different routes on the website.
|
│ ├── router.rs # Provides functions to handle the different routes on the website.
|
||||||
└── routes # A folder that contains code to handle the bigger route for the website.
|
│ └── routes # A folder that contains code to handle the bigger route for the website.
|
||||||
├── mod.rs # A module file for the rust project.
|
│ ├── mod.rs # A module file for the rust project.
|
||||||
└── search.rs # Provides the function to handle the search route.
|
│ └── search.rs # Provides the function to handle the search route.
|
||||||
|
└── templates # A module that provides and handles Maud HTML framework source code for the search engine website (subfolders and files are explained in the above frontend section.)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Development Tools
|
## Development Tools
|
||||||
|
@ -44,7 +44,7 @@ nix build .#websurfx
|
|||||||
nix run .#websurfx
|
nix run .#websurfx
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> In the above command the dollar sign(**$**) refers to running the command in Privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
> In the above command the dollar sign(**$**) refers to running the command in Privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
||||||
|
|
||||||
Once you have run the above set of commands, open your preferred web browser and navigate to http://127.0.0.1:8080/ to start using Websurfx.
|
Once you have run the above set of commands, open your preferred web browser and navigate to http://127.0.0.1:8080/ to start using Websurfx.
|
||||||
@ -89,7 +89,7 @@ nix build .#websurfx
|
|||||||
nix run .#websurfx
|
nix run .#websurfx
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
||||||
|
|
||||||
## Other Distros
|
## Other Distros
|
||||||
@ -128,6 +128,16 @@ cd websurfx
|
|||||||
|
|
||||||
Once you have changed the directory to the `websurfx` directory then follow the build options listed below:
|
Once you have changed the directory to the `websurfx` directory then follow the build options listed below:
|
||||||
|
|
||||||
|
> [!Note]
|
||||||
|
> Before you start building the search engine using one of the below listed command. We would strongly recommend setting the `PKG_ENV` enviroment variable as this applies some special optimization to code to reduce the file and improve the page load speed of the website.
|
||||||
|
> To set the `PKG_ENV` enviroment variable in the `bash` shell run the following command:
|
||||||
|
>
|
||||||
|
> ```bash
|
||||||
|
> export PKG_ENV="prod"
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> For how to set the environment variables in other shells. You can follow the instructions on how to do so by visiting the documentation of the specific shell you are using.
|
||||||
|
|
||||||
### Hybrid Cache
|
### Hybrid Cache
|
||||||
|
|
||||||
> For more information on the features and their pros and cons. see: [**Features**](./features.md)
|
> For more information on the features and their pros and cons. see: [**Features**](./features.md)
|
||||||
@ -285,22 +295,22 @@ Then run the following command to deploy the search engine:
|
|||||||
$ docker compose up -d
|
$ docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec` or any other privileged access methods.
|
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec` or any other privileged access methods.
|
||||||
|
|
||||||
Then launch the browser of your choice and navigate to http://<ip_address_of_the_device>:<whatever_port_you_provided_in_the_config>.
|
Then launch the browser of your choice and navigate to http://<ip_address_of_the_device>:<whatever_port_you_provided_in_the_config>.
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> The official prebuild images only support `stable` versions of the app and will not support `rolling/edge/unstable` versions. But with support and contribution, it could be made available for these versions as well 🙂.
|
> The official prebuild images only support `stable` versions of the app and will not support `rolling/edge/unstable` versions. But with support and contribution, it could be made available for these versions as well 🙂.
|
||||||
|
|
||||||
## Manual Deployment
|
## Manual Deployment
|
||||||
|
|
||||||
This section covers how to deploy the app with docker manually by manually building the image and deploying it.
|
This section covers how to deploy the app with docker manually by manually building the image and deploying it.
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> This section is provided for those who want to further customize the docker image or for those who are extra cautious about security.
|
> This section is provided for those who want to further customize the docker image or for those who are extra cautious about security.
|
||||||
|
|
||||||
> **Warning**
|
> [!Warning]
|
||||||
> A note of caution the project currently only supports **x86-64** architecture and as such we do not recommend deploying the project on devices with other architectures. Though if you still want to do it then **do it at your own risk**.
|
> A note of caution the project currently only supports **x86-64** architecture and as such we do not recommend deploying the project on devices with other architectures. Though if you still want to do it then **do it at your own risk**.
|
||||||
|
|
||||||
### Unstable/Edge/Rolling
|
### Unstable/Edge/Rolling
|
||||||
@ -317,19 +327,19 @@ After that edit the config.lua file located under `websurfx` directory. In the c
|
|||||||
```lua
|
```lua
|
||||||
-- ### General ###
|
-- ### General ###
|
||||||
logging = true -- an option to enable or disable logs.
|
logging = true -- an option to enable or disable logs.
|
||||||
debug = false -- an option to enable or disable debug mode.
|
debug = false -- an option to enable or disable debug mode.
|
||||||
threads = 8 -- the amount of threads that the app will use to run (the value should be greater than 0).
|
threads = 10 -- the amount of threads that the app will use to run (the value should be greater than 0).
|
||||||
|
|
||||||
-- ### Server ###
|
-- ### Server ###
|
||||||
port = "8080" -- port on which server should be launched
|
port = "8080" -- port on which server should be launched
|
||||||
binding_ip = "0.0.0.0" --ip address on the server should be launched.
|
binding_ip = "127.0.0.1" --ip address on the which server should be launched.
|
||||||
production_use = false -- whether to use production mode or not (in other words this option should be used if it is to be used to host it on the server to provide a service to a large number of users (more than one))
|
production_use = false -- whether to use production mode or not (in other words this option should be used if it is to be used to host it on the server to provide a service to a large number of users (more than one))
|
||||||
-- if production_use is set to true
|
-- if production_use is set to true
|
||||||
-- There will be a random delay before sending the request to the search engines, this is to prevent DDoSing the upstream search engines from a large number of simultaneous requests.
|
-- There will be a random delay before sending the request to the search engines, this is to prevent DDoSing the upstream search engines from a large number of simultaneous requests.
|
||||||
request_timeout = 30 -- timeout for the search requests sent to the upstream search engines to be fetched (value in seconds).
|
request_timeout = 30 -- timeout for the search requests sent to the upstream search engines to be fetched (value in seconds).
|
||||||
rate_limiter = {
|
rate_limiter = {
|
||||||
number_of_requests = 20, -- The number of requests that are allowed within a provided time limit.
|
number_of_requests = 20, -- The number of request that are allowed within a provided time limit.
|
||||||
time_limit = 3, -- The time limit in which the number of requests that should be accepted.
|
time_limit = 3, -- The time limit in which the quantity of requests that should be accepted.
|
||||||
}
|
}
|
||||||
|
|
||||||
-- ### Search ###
|
-- ### Search ###
|
||||||
@ -360,15 +370,18 @@ safe_search = 2
|
|||||||
-- tomorrow-night
|
-- tomorrow-night
|
||||||
-- }}
|
-- }}
|
||||||
colorscheme = "catppuccin-mocha" -- the colorscheme name which should be used for the website theme
|
colorscheme = "catppuccin-mocha" -- the colorscheme name which should be used for the website theme
|
||||||
theme = "simple" -- the theme name which should be used for the website
|
theme = "simple" -- the theme name which should be used for the website
|
||||||
|
|
||||||
-- ### Caching ###
|
-- ### Caching ###
|
||||||
redis_url = "redis://redis:6379" -- redis connection url address on which the client should connect on.
|
redis_url = "redis://127.0.0.1:8082" -- redis connection url address on which the client should connect on.
|
||||||
|
cache_expiry_time = 600 -- This option takes the expiry time of the search results (value in seconds and the value should be greater than or equal to 60 seconds).
|
||||||
-- ### Search Engines ###
|
-- ### Search Engines ###
|
||||||
upstream_search_engines = {
|
upstream_search_engines = {
|
||||||
DuckDuckGo = true,
|
DuckDuckGo = true,
|
||||||
Searx = false,
|
Searx = false,
|
||||||
|
Brave = false,
|
||||||
|
Startpage = false,
|
||||||
|
LibreX = false,
|
||||||
} -- select the upstream search engines from which the results should be fetched.
|
} -- select the upstream search engines from which the results should be fetched.
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -378,7 +391,7 @@ After this make sure to edit the `docker-compose.yml` and `Dockerfile` files as
|
|||||||
$ docker compose up -d --build
|
$ docker compose up -d --build
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
> In the above command the dollar sign(**$**) refers to running the command in privileged mode by using utilities `sudo`, `doas`, `pkgexec`, or any other privileged access methods.
|
||||||
|
|
||||||
This will take around 5-10 mins for the first deployment, afterwards, the docker build stages will be cached so it will be faster to build from next time onwards. After the above step finishes launch your preferred browser and then navigate to `http://<ip_address_of_the_device>:<whatever_port_you_provided_in_the_config>`.
|
This will take around 5-10 mins for the first deployment, afterwards, the docker build stages will be cached so it will be faster to build from next time onwards. After the above step finishes launch your preferred browser and then navigate to `http://<ip_address_of_the_device>:<whatever_port_you_provided_in_the_config>`.
|
||||||
|
345
docs/theming.md
345
docs/theming.md
@ -1,17 +1,25 @@
|
|||||||
# Colorschemes
|
# Theming
|
||||||
|
|
||||||
## Built-in
|
## Colorschemes
|
||||||
|
|
||||||
By default `websurfx` comes with 9 colorschemes to choose from which can be easily chosen using the config file. To how to change colorschemes please view the [Configuration](https://github.com/neon-mmd/websurfx/wiki/configuration) section of the wiki.
|
### Built-in
|
||||||
|
|
||||||
## Custom
|
By default `websurfx` comes with 12 colorschemes to choose from which can be easily chosen using the config file or via the settings page on the website.
|
||||||
|
|
||||||
Creating coloschemes is as easy as it gets it requires the user to have a theme file name with the colorscheme in which every space should be replaced with a `-` (dash) and it should end with a `.css` file extension. After creating the file you need to add the following code with the `colors` you want:
|
> To how to change colorschemes using the config file. See: [**Configuration**](https://github.com/neon-mmd/websurfx/wiki/configuration)
|
||||||
|
|
||||||
|
### Custom
|
||||||
|
|
||||||
|
To write a custom theme for the website, you will first need to create a new file under the `public/static/themes` folder with name of the theme containing each word seperated with a hyphen (**-**). Then after that edit the newly created file as required with new css code.
|
||||||
|
|
||||||
|
Creating coloschemes is as easy as it gets it requires the user to have a colorscheme file name with the name of the colorscheme that is to be provided in which every space should be replaced with a `-` (dash) and it should end with a `.css` file extension. After creating the file you need to add the following code with the `colors` you want to include:
|
||||||
|
|
||||||
```css
|
```css
|
||||||
:root {
|
:root {
|
||||||
--background-color: <background color>;
|
--background-color: <background color>;
|
||||||
--foreground-color: <foreground color (text color on the website) >;
|
--foreground-color: <foreground color (text color on the website) >;
|
||||||
|
--logo-color: <logo color
|
||||||
|
(the color of the logo svg image on the website homepage) >;
|
||||||
--color-one: <color 1>;
|
--color-one: <color 1>;
|
||||||
--color-two: <color 2>;
|
--color-two: <color 2>;
|
||||||
--color-three: <color 3>;
|
--color-three: <color 3>;
|
||||||
@ -22,7 +30,7 @@ Creating coloschemes is as easy as it gets it requires the user to have a theme
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Note**
|
> [!Note]
|
||||||
> Please infer the theme file located under `public/static/themes` to better understand where each color is being used.
|
> Please infer the theme file located under `public/static/themes` to better understand where each color is being used.
|
||||||
|
|
||||||
**Example of `catppuccin-mocha` colorscheme:**
|
**Example of `catppuccin-mocha` colorscheme:**
|
||||||
@ -31,6 +39,7 @@ Creating coloschemes is as easy as it gets it requires the user to have a theme
|
|||||||
:root {
|
:root {
|
||||||
--background-color: #1e1e2e;
|
--background-color: #1e1e2e;
|
||||||
--foreground-color: #cdd6f4;
|
--foreground-color: #cdd6f4;
|
||||||
|
--logo-color: #f5c2e7;
|
||||||
--color-one: #45475a;
|
--color-one: #45475a;
|
||||||
--color-two: #f38ba8;
|
--color-two: #f38ba8;
|
||||||
--color-three: #a6e3a1;
|
--color-three: #a6e3a1;
|
||||||
@ -41,21 +50,31 @@ Creating coloschemes is as easy as it gets it requires the user to have a theme
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
# Themes
|
## Themes
|
||||||
|
|
||||||
## Built-in
|
### Built-in
|
||||||
|
|
||||||
By default `websurfx` comes with 1 theme to choose from which can be easily chosen using the config file. To how to change themes please view the [Configuration](https://github.com/neon-mmd/websurfx/wiki/configuration) section of the wiki.
|
By default `websurfx` comes with 1 theme to choose from which can be easily chosen using the config file or via the settings page on the website.
|
||||||
|
|
||||||
## Custom
|
> To how to change themes using the config file. See: [**Configuration**](https://github.com/neon-mmd/websurfx/wiki/configuration)
|
||||||
|
|
||||||
To write custom color scheme, it requires the user to have some knowledge of `css stylesheets`.
|
### Custom
|
||||||
|
|
||||||
**Here is an example of `simple theme` (which we provide by default with the app) which will give the user a better idea on how to create a custom theme using it as a template:**
|
> This section expects the user to have some knowledge of `css`.
|
||||||
|
|
||||||
### General
|
To write a custom theme for the website, you will first need to create a new file under the `public/static/themes` folder with name of the theme containing each word seperated with a hyphen (**-**). Then after that edit the newly created file as required with new css code.
|
||||||
|
|
||||||
|
Here is an example of `simple theme` (which we provide by default with the app) which will give you a better idea on how you can create your own custom theme for the website:
|
||||||
|
|
||||||
|
#### General
|
||||||
|
|
||||||
```css
|
```css
|
||||||
|
@font-face {
|
||||||
|
font-family: Rubik;
|
||||||
|
src: url('https://fonts.googleapis.com/css2?family=Rubik:wght@400;500;600;700;800&display=swap');
|
||||||
|
fallback: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
* {
|
* {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@ -72,11 +91,17 @@ body {
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
height: 100vh;
|
height: 100vh;
|
||||||
background: var(--color-one);
|
font-family: Rubik, sans-serif;
|
||||||
|
background-color: var(--background-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* enforce font for buttons */
|
||||||
|
button {
|
||||||
|
font-family: Rubik, sans-serif;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Styles for the index page
|
#### Styles for the index page
|
||||||
|
|
||||||
```css
|
```css
|
||||||
.search-container {
|
.search-container {
|
||||||
@ -87,44 +112,69 @@ body {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search-container svg {
|
||||||
|
color: var(--logo-color);
|
||||||
|
}
|
||||||
|
|
||||||
.search-container div {
|
.search-container div {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Styles for the search box and search button
|
#### Styles for the search box and search button
|
||||||
|
|
||||||
```css
|
```css
|
||||||
.search_bar {
|
.search_bar {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search_bar input {
|
.search_bar input {
|
||||||
padding: 1rem;
|
border-radius: 6px;
|
||||||
|
padding: 2.6rem 2.2rem;
|
||||||
width: 50rem;
|
width: 50rem;
|
||||||
height: 3rem;
|
height: 3rem;
|
||||||
outline: none;
|
outline: none;
|
||||||
border: none;
|
border: none;
|
||||||
box-shadow: rgba(0, 0, 0, 1);
|
box-shadow: rgb(0 0 0 / 1);
|
||||||
background: var(--foreground-color);
|
background-color: var(--color-one);
|
||||||
|
color: var(--foreground-color);
|
||||||
|
outline-offset: 3px;
|
||||||
|
font-size: 1.6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search_bar input:focus {
|
||||||
|
outline: 2px solid var(--foreground-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.search_bar input::placeholder {
|
||||||
|
color: var(--foreground-color);
|
||||||
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search_bar button {
|
.search_bar button {
|
||||||
padding: 1rem;
|
padding: 2.6rem 3.2rem;
|
||||||
border-radius: 0;
|
border-radius: 6px;
|
||||||
height: 3rem;
|
height: 3rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
outline: none;
|
outline-offset: 3px;
|
||||||
|
outline: 2px solid transparent;
|
||||||
border: none;
|
border: none;
|
||||||
|
transition: 0.1s;
|
||||||
gap: 0;
|
gap: 0;
|
||||||
background: var(--background-color);
|
background-color: var(--color-six);
|
||||||
color: var(--color-three);
|
color: var(--background-color);
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
letter-spacing: 0.1rem;
|
letter-spacing: 0.1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search_bar button:active {
|
||||||
|
outline: 2px solid var(--color-three);
|
||||||
|
}
|
||||||
|
|
||||||
.search_bar button:active,
|
.search_bar button:active,
|
||||||
.search_bar button:hover {
|
.search_bar button:hover {
|
||||||
filter: brightness(1.2);
|
filter: brightness(1.2);
|
||||||
@ -141,13 +191,19 @@ body {
|
|||||||
width: 20rem;
|
width: 20rem;
|
||||||
background-color: var(--color-one);
|
background-color: var(--color-one);
|
||||||
color: var(--foreground-color);
|
color: var(--foreground-color);
|
||||||
padding: 1rem 2rem;
|
padding: 1.2rem 2rem;
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
outline: none;
|
outline-offset: 3px;
|
||||||
|
outline: 2px solid transparent;
|
||||||
border: none;
|
border: none;
|
||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search_area .search_options select:active,
|
||||||
|
.search_area .search_options select:hover {
|
||||||
|
outline: 2px solid var(--color-three);
|
||||||
|
}
|
||||||
|
|
||||||
.search_area .search_options option:hover {
|
.search_area .search_options option:hover {
|
||||||
background-color: var(--color-one);
|
background-color: var(--color-one);
|
||||||
}
|
}
|
||||||
@ -170,9 +226,7 @@ body {
|
|||||||
.result_not_found img {
|
.result_not_found img {
|
||||||
width: 40rem;
|
width: 40rem;
|
||||||
}
|
}
|
||||||
```
|
|
||||||
|
|
||||||
```css
|
|
||||||
/* styles for the error box */
|
/* styles for the error box */
|
||||||
.error_box .error_box_toggle_button {
|
.error_box .error_box_toggle_button {
|
||||||
background: var(--foreground-color);
|
background: var(--foreground-color);
|
||||||
@ -188,9 +242,11 @@ body {
|
|||||||
min-height: 20rem;
|
min-height: 20rem;
|
||||||
min-width: 22rem;
|
min-width: 22rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.error_box .dropdown_error_box.show {
|
.error_box .dropdown_error_box.show {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
.error_box .dropdown_error_box .error_item,
|
.error_box .dropdown_error_box .error_item,
|
||||||
.error_box .dropdown_error_box .no_errors {
|
.error_box .dropdown_error_box .no_errors {
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -200,22 +256,25 @@ body {
|
|||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.error_box .dropdown_error_box .error_item {
|
.error_box .dropdown_error_box .error_item {
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
.error_box .dropdown_error_box .no_errors {
|
.error_box .dropdown_error_box .no_errors {
|
||||||
min-height: 18rem;
|
min-height: 18rem;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.error_box .dropdown_error_box .error_item:hover {
|
.error_box .dropdown_error_box .error_item:hover {
|
||||||
box-shadow: inset 0 0 100px 100px rgba(255, 255, 255, 0.1);
|
box-shadow: inset 0 0 100px 100px rgb(255 255 255 / 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.error_box .error_item .severity_color {
|
.error_box .error_item .severity_color {
|
||||||
width: 1.2rem;
|
width: 1.2rem;
|
||||||
height: 1.2rem;
|
height: 1.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.results .result_disallowed,
|
.results .result_disallowed,
|
||||||
.results .result_filtered,
|
.results .result_filtered,
|
||||||
.results .result_engine_not_selected {
|
.results .result_engine_not_selected {
|
||||||
@ -225,7 +284,7 @@ body {
|
|||||||
gap: 10rem;
|
gap: 10rem;
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
color: var(--foreground-color);
|
color: var(--foreground-color);
|
||||||
margin: 0rem 7rem;
|
margin: 0 7rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.results .result_disallowed .user_query,
|
.results .result_disallowed .user_query,
|
||||||
@ -251,16 +310,34 @@ body {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Styles for the footer and header
|
#### Styles for the footer and header
|
||||||
|
|
||||||
```css
|
```css
|
||||||
header {
|
header {
|
||||||
background: var(--background-color);
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
background: var(--background-color);
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: right;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 1rem;
|
justify-content: space-between;
|
||||||
|
padding: 2rem 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
width: 100%;
|
||||||
|
background: var(--background-color);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 1.7rem 1.7rem 4rem;
|
||||||
|
gap: 1.8rem;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
header h1 a {
|
||||||
|
text-transform: capitalize;
|
||||||
|
text-decoration: none;
|
||||||
|
color: var(--foreground-color);
|
||||||
|
letter-spacing: 0.1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
header ul,
|
header ul,
|
||||||
@ -301,39 +378,9 @@ footer div {
|
|||||||
display: flex;
|
display: flex;
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
footer {
|
|
||||||
background: var(--background-color);
|
|
||||||
width: 100%;
|
|
||||||
padding: 1rem;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
footer div span {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
color: var(--4);
|
|
||||||
}
|
|
||||||
|
|
||||||
footer div {
|
|
||||||
display: flex;
|
|
||||||
gap: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
footer {
|
|
||||||
background: var(--bg);
|
|
||||||
width: 100%;
|
|
||||||
padding: 1rem;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Styles for the search page
|
#### Styles for the search page
|
||||||
|
|
||||||
```css
|
```css
|
||||||
.results {
|
.results {
|
||||||
@ -341,6 +388,11 @@ footer {
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.result {
|
||||||
|
gap: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.results .search_bar {
|
.results .search_bar {
|
||||||
@ -352,6 +404,7 @@ footer {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
margin: 2rem 0;
|
margin: 2rem 0;
|
||||||
|
content-visibility: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.results_aggregated .result {
|
.results_aggregated .result {
|
||||||
@ -361,10 +414,10 @@ footer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.results_aggregated .result h1 a {
|
.results_aggregated .result h1 a {
|
||||||
font-size: 1.5rem;
|
font-size: 1.7rem;
|
||||||
|
font-weight: normal;
|
||||||
color: var(--color-two);
|
color: var(--color-two);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
letter-spacing: 0.1rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.results_aggregated .result h1 a:hover {
|
.results_aggregated .result h1 a:hover {
|
||||||
@ -377,14 +430,15 @@ footer {
|
|||||||
|
|
||||||
.results_aggregated .result small {
|
.results_aggregated .result small {
|
||||||
color: var(--color-three);
|
color: var(--color-three);
|
||||||
font-size: 1.1rem;
|
font-size: 1.3rem;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
line-break: anywhere;
|
line-break: anywhere;
|
||||||
}
|
}
|
||||||
|
|
||||||
.results_aggregated .result p {
|
.results_aggregated .result p {
|
||||||
color: var(--foreground-color);
|
color: var(--foreground-color);
|
||||||
font-size: 1.2rem;
|
font-size: 1.4rem;
|
||||||
|
line-height: 2.4rem;
|
||||||
margin-top: 0.3rem;
|
margin-top: 0.3rem;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
line-break: anywhere;
|
line-break: anywhere;
|
||||||
@ -395,10 +449,13 @@ footer {
|
|||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
color: var(--color-five);
|
color: var(--color-five);
|
||||||
|
display: flex;
|
||||||
|
gap: 1rem;
|
||||||
|
justify-content: right;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Styles for the 404 page
|
#### Styles for the 404 page
|
||||||
|
|
||||||
```css
|
```css
|
||||||
.error_container {
|
.error_container {
|
||||||
@ -448,11 +505,11 @@ footer {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Styles for the previous and next button on the search page
|
#### Styles for the previous and next button on the search page
|
||||||
|
|
||||||
```css
|
```css
|
||||||
.page_navigation {
|
.page_navigation {
|
||||||
padding: 0 0 2rem 0;
|
padding: 0 0 2rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -472,7 +529,7 @@ footer {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Styles for the about page
|
#### Styles for the about page
|
||||||
|
|
||||||
This part is only available right now in the **rolling/edge/unstable** version
|
This part is only available right now in the **rolling/edge/unstable** version
|
||||||
|
|
||||||
@ -517,7 +574,7 @@ This part is only available right now in the **rolling/edge/unstable** version
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Styles for the Settings Page
|
#### Styles for the Settings Page
|
||||||
|
|
||||||
This part is only available right now in the **rolling/edge/unstable** version
|
This part is only available right now in the **rolling/edge/unstable** version
|
||||||
|
|
||||||
@ -526,6 +583,7 @@ This part is only available right now in the **rolling/edge/unstable** version
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
width: 80dvw;
|
width: 80dvw;
|
||||||
|
margin: 5rem 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings h1 {
|
.settings h1 {
|
||||||
@ -533,9 +591,18 @@ This part is only available right now in the **rolling/edge/unstable** version
|
|||||||
font-size: 2.5rem;
|
font-size: 2.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.settings > h1 {
|
||||||
|
margin-bottom: 4rem;
|
||||||
|
margin-left: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
.settings hr {
|
.settings hr {
|
||||||
border-color: var(--color-three);
|
border-color: var(--color-three);
|
||||||
margin: 0.3rem 0 1rem 0;
|
margin: 0.3rem 0 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings > hr {
|
||||||
|
margin-left: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings_container .sidebar {
|
.settings_container .sidebar {
|
||||||
@ -548,7 +615,6 @@ This part is only available right now in the **rolling/edge/unstable** version
|
|||||||
margin-left: -0.7rem;
|
margin-left: -0.7rem;
|
||||||
padding: 0.7rem;
|
padding: 0.7rem;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
font-weight: bold;
|
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
color: var(--foreground-color);
|
color: var(--foreground-color);
|
||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
@ -556,18 +622,30 @@ This part is only available right now in the **rolling/edge/unstable** version
|
|||||||
}
|
}
|
||||||
|
|
||||||
.settings_container .sidebar .btn {
|
.settings_container .sidebar .btn {
|
||||||
padding: 0.5rem;
|
padding: 2rem;
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
|
outline-offset: 3px;
|
||||||
|
outline: 2px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings_container .sidebar .btn:active {
|
||||||
|
outline: 2px solid var(--color-two);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings_container .sidebar .btn:not(.active):hover {
|
||||||
|
color: var(--color-two);
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings_container .sidebar .btn.active {
|
.settings_container .sidebar .btn.active {
|
||||||
background-color: var(--color-two);
|
background-color: var(--color-two);
|
||||||
|
color: var(--background-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings_container .main_container {
|
.settings_container .main_container {
|
||||||
width: 70%;
|
width: 70%;
|
||||||
border-left: 1.5px solid var(--color-three);
|
border-left: 1.5px solid var(--color-three);
|
||||||
padding-left: 3rem;
|
padding-left: 3rem;
|
||||||
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings_container .tab {
|
.settings_container .tab {
|
||||||
@ -576,6 +654,7 @@ This part is only available right now in the **rolling/edge/unstable** version
|
|||||||
|
|
||||||
.settings_container .tab.active {
|
.settings_container .tab.active {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
gap: 1.2rem;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
}
|
}
|
||||||
@ -623,7 +702,7 @@ This part is only available right now in the **rolling/edge/unstable** version
|
|||||||
.settings_container .general select {
|
.settings_container .general select {
|
||||||
margin: 0.7rem 0;
|
margin: 0.7rem 0;
|
||||||
width: 20rem;
|
width: 20rem;
|
||||||
background-color: var(--background-color);
|
background-color: var(--color-one);
|
||||||
color: var(--foreground-color);
|
color: var(--foreground-color);
|
||||||
padding: 1rem 2rem;
|
padding: 1rem 2rem;
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
@ -641,16 +720,19 @@ This part is only available right now in the **rolling/edge/unstable** version
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
gap: 1rem;
|
|
||||||
padding: 1rem 0;
|
padding: 1rem 0;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
gap: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings_container .engines .toggle_btn {
|
.settings_container .engines .toggle_btn {
|
||||||
color: var(--foreground-color);
|
color: var(--foreground-color);
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 0.5rem;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
border-radius: 100px;
|
||||||
|
gap: 1.5rem;
|
||||||
|
letter-spacing: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings_container .engines hr {
|
.settings_container .engines hr {
|
||||||
@ -658,11 +740,11 @@ This part is only available right now in the **rolling/edge/unstable** version
|
|||||||
}
|
}
|
||||||
|
|
||||||
.settings_container .cookies input {
|
.settings_container .cookies input {
|
||||||
margin: 1rem 0rem;
|
margin: 1rem 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Styles for the Toggle Button
|
#### Styles for the Toggle Button
|
||||||
|
|
||||||
This part is only available right now in the **rolling/edge/unstable** version
|
This part is only available right now in the **rolling/edge/unstable** version
|
||||||
|
|
||||||
@ -686,25 +768,26 @@ This part is only available right now in the **rolling/edge/unstable** version
|
|||||||
.slider {
|
.slider {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
top: 0;
|
inset: 0;
|
||||||
left: 0;
|
background-color: var(--foreground-color);
|
||||||
right: 0;
|
transition: 0.2s;
|
||||||
bottom: 0;
|
outline-offset: 3px;
|
||||||
background-color: var(--background-color);
|
outline: 2px solid transparent;
|
||||||
-webkit-transition: 0.4s;
|
|
||||||
transition: 0.4s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.slider:before {
|
.slider:active {
|
||||||
|
outline: 2px solid var(--foreground-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider::before {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
content: '';
|
content: '';
|
||||||
height: 2.6rem;
|
height: 2.6rem;
|
||||||
width: 2.6rem;
|
width: 2.6rem;
|
||||||
left: 0.4rem;
|
left: 0.4rem;
|
||||||
bottom: 0.4rem;
|
bottom: 0.4rem;
|
||||||
background-color: var(--foreground-color);
|
background-color: var(--background-color);
|
||||||
-webkit-transition: 0.4s;
|
transition: 0.2s;
|
||||||
transition: 0.4s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
input:checked + .slider {
|
input:checked + .slider {
|
||||||
@ -715,9 +798,7 @@ input:focus + .slider {
|
|||||||
box-shadow: 0 0 1px var(--color-three);
|
box-shadow: 0 0 1px var(--color-three);
|
||||||
}
|
}
|
||||||
|
|
||||||
input:checked + .slider:before {
|
input:checked + .slider::before {
|
||||||
-webkit-transform: translateX(2.6rem);
|
|
||||||
-ms-transform: translateX(2.6rem);
|
|
||||||
transform: translateX(2.6rem);
|
transform: translateX(2.6rem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -726,9 +807,79 @@ input:checked + .slider:before {
|
|||||||
border-radius: 3.4rem;
|
border-radius: 3.4rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.slider.round:before {
|
.slider.round::before {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Animations
|
||||||
|
|
||||||
|
### Built-in
|
||||||
|
|
||||||
|
By default `websurfx` comes with 1 animation to choose from which can be easily chosen using the config file or via the settings page on the website.
|
||||||
|
|
||||||
|
> To how to change animations using the config file. See: [**Configuration**](https://github.com/neon-mmd/websurfx/wiki/configuration)
|
||||||
|
|
||||||
|
### Custom
|
||||||
|
|
||||||
|
To write custom animation, it requires the user to have some knowledge of `themes` and the `HTML of the page for which the animation is being provided for`.
|
||||||
|
|
||||||
|
The animations can be of 2 categories:
|
||||||
|
|
||||||
|
- Theme specific animations
|
||||||
|
- Universal animations
|
||||||
|
|
||||||
|
#### Theme Specific Animations
|
||||||
|
|
||||||
|
These animations can only be used with a specific theme and should not be used with other themes otherwise it either won't look good or won't work at all or would work partially.
|
||||||
|
|
||||||
|
Here is an example of `simple-frosted-glow` animation for the `simple theme` (which we provide by default with the app) which will give you a better idea on how to create a custom animation for a specific theme:
|
||||||
|
|
||||||
|
```css
|
||||||
|
.results_aggregated .result {
|
||||||
|
margin: 1rem;
|
||||||
|
padding: 1rem;
|
||||||
|
border-radius: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.results_aggregated .result:hover {
|
||||||
|
box-shadow:
|
||||||
|
inset 0 0 3rem var(--color-two),
|
||||||
|
inset 0 0 6rem var(--color-five),
|
||||||
|
inset 0 0 9rem var(--color-three),
|
||||||
|
0 0 0.25rem var(--color-two),
|
||||||
|
0 0 0.5rem var(--color-five),
|
||||||
|
0 0 0.75rem var(--color-three);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Universal Animations
|
||||||
|
|
||||||
|
These animations are independent of the theme being used and can be used with all the themes.
|
||||||
|
|
||||||
|
Here is an example of `text-tilt` animation which will give you an idea on how to create universal animations for the search engine website.
|
||||||
|
|
||||||
|
```css
|
||||||
|
.results_aggregated .result:hover {
|
||||||
|
transform: skewX(10deg);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!Note]
|
||||||
|
> 1. The above-mentioned examples of animations was covered for the search page of the search engine website. While the same way of creating custom animations can also be done for other pages also.
|
||||||
|
> 2. While the naming the file for the new theme file. Follow the following naming conventions:
|
||||||
|
> 1. If the animation is theme specfic then name of the animation file should look like this:
|
||||||
|
> `<name of the theme which these animation is for><seperated by a hyphen or dash><name of the animation with whitespaces replaced with hyphens>`
|
||||||
|
> **For example:**
|
||||||
|
> If the animation to make search results frosty glow on hover was to be created for the `simple` theme then the name of the file would look something like this:
|
||||||
|
> `simple-frosted-glow`
|
||||||
|
> Where `simple` is the name of the theme the animation targets and `frosted-glow` is the name of the animation where each word has been seperated by a hyphen.
|
||||||
|
> 2. If the animation is not theme specfic (univeral theme) then name of the animation file should look like this:
|
||||||
|
> `<name of the animation with whitespaces replaced with hyphens>`
|
||||||
|
> **For example:**
|
||||||
|
> If the animation to make search results text tilt on hover was to be created then the name of the file would look something like this:
|
||||||
|
> `text-tilt`
|
||||||
|
> Where `text-tilt` is the name of the animation where each word has been seperated by a hyphen. (While naming the files for these types of themes, You do not need to add a theme name in frontend of the file name.).
|
||||||
|
|
||||||
|
|
||||||
[⬅️ Go back to Home](./README.md)
|
[⬅️ Go back to Home](./README.md)
|
||||||
|
@ -60,4 +60,4 @@
|
|||||||
# calls the build function
|
# calls the build function
|
||||||
packages.websurfx = packages.default;
|
packages.websurfx = packages.default;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
1
public/images/magnifying_glass.svg
Normal file
1
public/images/magnifying_glass.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 50 50" width="24px" height="24px"><circle fill="none" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" cx="21" cy="20" r="16"/><line fill="none" stroke="#000000" stroke-width="4" stroke-miterlimit="10" x1="32.229" y1="32.229" x2="45.5" y2="45.5"/></svg>
|
After Width: | Height: | Size: 610 B |
@ -1,3 +1,62 @@
|
|||||||
|
/**
|
||||||
|
* This functions gets the saved cookies if it is present on the user's machine If it
|
||||||
|
* is available then it is parsed and converted to an object which is then used to
|
||||||
|
* retrieve the preferences that the user had selected previously and is then loaded
|
||||||
|
* and used for displaying the user provided settings by setting them as the selected
|
||||||
|
* options in the settings page.
|
||||||
|
*
|
||||||
|
* @function
|
||||||
|
* @param {string} cookie - It takes the client settings cookie as a string.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
function setClientSettingsOnPage(cookie) {
|
||||||
|
let cookie_value = cookie
|
||||||
|
.split(';')
|
||||||
|
.map((item) => item.split('='))
|
||||||
|
.reduce((acc, [_, v]) => (acc = JSON.parse(v)) && acc, {})
|
||||||
|
|
||||||
|
// Loop through all select tags and add their values to the cookie dictionary
|
||||||
|
document.querySelectorAll('select').forEach((select_tag) => {
|
||||||
|
switch (select_tag.name) {
|
||||||
|
case 'themes':
|
||||||
|
select_tag.value = cookie_value['theme']
|
||||||
|
break
|
||||||
|
case 'colorschemes':
|
||||||
|
select_tag.value = cookie_value['colorscheme']
|
||||||
|
break
|
||||||
|
case 'animations':
|
||||||
|
select_tag.value = cookie_value['animation']
|
||||||
|
break
|
||||||
|
case 'safe_search_levels':
|
||||||
|
select_tag.value = cookie_value['safe_search_level']
|
||||||
|
break
|
||||||
|
}
|
||||||
|
})
|
||||||
|
let engines = document.querySelectorAll('.engine')
|
||||||
|
let engines_cookie = cookie_value['engines']
|
||||||
|
|
||||||
|
if (engines_cookie.length === engines.length) {
|
||||||
|
document.querySelector('.select_all').checked = true
|
||||||
|
engines.forEach((engine_checkbox) => {
|
||||||
|
engine_checkbox.checked = true
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
engines.forEach((engines_checkbox) => {
|
||||||
|
engines_checkbox.checked = false
|
||||||
|
})
|
||||||
|
engines_cookie.forEach((engine_name) => {
|
||||||
|
engines.forEach((engine_checkbox) => {
|
||||||
|
if (
|
||||||
|
engine_checkbox.parentNode.parentNode.innerText.trim() ===
|
||||||
|
engine_name.trim()
|
||||||
|
) {
|
||||||
|
engine_checkbox.checked = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function is executed when any page on the website finishes loading and
|
* This function is executed when any page on the website finishes loading and
|
||||||
* this function retrieves the cookies if it is present on the user's machine.
|
* this function retrieves the cookies if it is present on the user's machine.
|
||||||
@ -16,9 +75,14 @@ document.addEventListener(
|
|||||||
let cookie = decodeURIComponent(document.cookie)
|
let cookie = decodeURIComponent(document.cookie)
|
||||||
// Set the value of the input field to the decoded cookie value if it is not empty
|
// Set the value of the input field to the decoded cookie value if it is not empty
|
||||||
// Otherwise, display a message indicating that no cookies have been saved on the user's system
|
// Otherwise, display a message indicating that no cookies have been saved on the user's system
|
||||||
document.querySelector('.cookies input').value = cookie.length
|
if (cookie.length) {
|
||||||
? cookie
|
document.querySelector('.cookies input').value = cookie
|
||||||
: 'No cookies have been saved on your system'
|
// This function displays the user provided settings on the settings page.
|
||||||
|
setClientSettingsOnPage(cookie)
|
||||||
|
} else {
|
||||||
|
document.querySelector('.cookies input').value =
|
||||||
|
'No cookies have been saved on your system'
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// If there is an error decoding the cookie, log the error to the console
|
// If there is an error decoding the cookie, log the error to the console
|
||||||
// and display an error message in the input field
|
// and display an error message in the input field
|
||||||
|
@ -95,6 +95,14 @@ button {
|
|||||||
color: var(--background-color);
|
color: var(--background-color);
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
letter-spacing: 0.1rem;
|
letter-spacing: 0.1rem;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search_bar button img {
|
||||||
|
position:absolute;
|
||||||
|
left:50%;
|
||||||
|
top:50%;
|
||||||
|
transform:translate(-50%, -50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.search_bar button:active {
|
.search_bar button:active {
|
||||||
@ -600,12 +608,20 @@ footer div {
|
|||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings_container .tab .description {
|
.settings_container .tab .description,
|
||||||
|
.settings_container .tab .admin_warning {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings_container .tab .description {
|
||||||
color: var(--foreground-color);
|
color: var(--foreground-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.settings_container .tab .admin_warning {
|
||||||
|
color: var(--color-two);
|
||||||
|
}
|
||||||
|
|
||||||
.settings_container .user_interface select,
|
.settings_container .user_interface select,
|
||||||
.settings_container .general select {
|
.settings_container .general select {
|
||||||
margin: 0.7rem 0;
|
margin: 0.7rem 0;
|
||||||
|
124
src/engines/bing.rs
Normal file
124
src/engines/bing.rs
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
//! The `bing` module handles the scraping of results from the bing search engine
|
||||||
|
//! by querying the upstream bing search engine with user provided query and with a page
|
||||||
|
//! number if provided.
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use regex::Regex;
|
||||||
|
use reqwest::header::HeaderMap;
|
||||||
|
use reqwest::Client;
|
||||||
|
use scraper::Html;
|
||||||
|
|
||||||
|
use crate::models::aggregation_models::SearchResult;
|
||||||
|
|
||||||
|
use crate::models::engine_models::{EngineError, SearchEngine};
|
||||||
|
|
||||||
|
use error_stack::{Report, Result, ResultExt};
|
||||||
|
|
||||||
|
use super::search_result_parser::SearchResultParser;
|
||||||
|
|
||||||
|
/// A new Bing engine type defined in-order to implement the `SearchEngine` trait which allows to
|
||||||
|
/// reduce code duplication as well as allows to create vector of different search engines easily.
|
||||||
|
pub struct Bing {
|
||||||
|
/// The parser, used to interpret the search result.
|
||||||
|
parser: SearchResultParser,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Bing {
|
||||||
|
/// Creates the Bing parser.
|
||||||
|
pub fn new() -> Result<Self, EngineError> {
|
||||||
|
Ok(Self {
|
||||||
|
parser: SearchResultParser::new(
|
||||||
|
".b_results",
|
||||||
|
".b_algo",
|
||||||
|
"h2 a",
|
||||||
|
".tpcn a.tilk",
|
||||||
|
".b_caption p",
|
||||||
|
)?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl SearchEngine for Bing {
|
||||||
|
async fn results(
|
||||||
|
&self,
|
||||||
|
query: &str,
|
||||||
|
page: u32,
|
||||||
|
user_agent: &str,
|
||||||
|
client: &Client,
|
||||||
|
_safe_search: u8,
|
||||||
|
) -> Result<HashMap<String, SearchResult>, EngineError> {
|
||||||
|
// Bing uses `start results from this number` convention
|
||||||
|
// So, for 10 results per page, page 0 starts at 1, page 1
|
||||||
|
// starts at 11, and so on.
|
||||||
|
let results_per_page = 10;
|
||||||
|
let start_result = results_per_page * page + 1;
|
||||||
|
|
||||||
|
let url: String = match page {
|
||||||
|
0 => {
|
||||||
|
format!("https://www.bing.com/search?q={query}")
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
format!("https://www.bing.com/search?q={query}&first={start_result}")
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let query_params: Vec<(&str, &str)> = vec![
|
||||||
|
("_EDGE_V", "1"),
|
||||||
|
("SRCHD=AF", "NOFORM"),
|
||||||
|
("_Rwho=u", "d"),
|
||||||
|
("bngps=s", "0"),
|
||||||
|
("_UR=QS=0&TQS", "0"),
|
||||||
|
("_UR=QS=0&TQS", "0"),
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut cookie_string = String::new();
|
||||||
|
for (k, v) in &query_params {
|
||||||
|
cookie_string.push_str(&format!("{k}={v}; "));
|
||||||
|
}
|
||||||
|
|
||||||
|
let header_map = HeaderMap::try_from(&HashMap::from([
|
||||||
|
("USER_AGENT".to_string(), user_agent.to_string()),
|
||||||
|
("REFERER".to_string(), "https://google.com/".to_string()),
|
||||||
|
(
|
||||||
|
"CONTENT_TYPE".to_string(),
|
||||||
|
"application/x-www-form-urlencoded".to_string(),
|
||||||
|
),
|
||||||
|
("COOKIE".to_string(), cookie_string),
|
||||||
|
]))
|
||||||
|
.change_context(EngineError::UnexpectedError)?;
|
||||||
|
|
||||||
|
let document: Html = Html::parse_document(
|
||||||
|
&Bing::fetch_html_from_upstream(self, &url, header_map, client).await?,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Bing is very aggressive in finding matches
|
||||||
|
// even with the most absurd of queries. ".b_algo" is the
|
||||||
|
// class for the list item of results
|
||||||
|
if let Some(no_result_msg) = self.parser.parse_for_no_results(&document).nth(0) {
|
||||||
|
if no_result_msg
|
||||||
|
.value()
|
||||||
|
.attr("class")
|
||||||
|
.map(|classes| classes.contains("b_algo"))
|
||||||
|
.unwrap_or(false)
|
||||||
|
{
|
||||||
|
return Err(Report::new(EngineError::EmptyResultSet));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let re_span = Regex::new(r#"<span.*?>.*?(?:</span> ·|</span>)"#).unwrap();
|
||||||
|
let re_strong = Regex::new(r#"(<strong>|</strong>)"#).unwrap();
|
||||||
|
|
||||||
|
// scrape all the results from the html
|
||||||
|
self.parser
|
||||||
|
.parse_for_results(&document, |title, url, desc| {
|
||||||
|
Some(SearchResult::new(
|
||||||
|
&re_strong.replace_all(title.inner_html().trim(), ""),
|
||||||
|
url.value().attr("href").unwrap(),
|
||||||
|
&re_span.replace_all(desc.inner_html().trim(), ""),
|
||||||
|
&["bing"],
|
||||||
|
))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -51,15 +51,14 @@ impl SearchEngine for DuckDuckGo {
|
|||||||
// Page number can be missing or empty string and so appropriate handling is required
|
// Page number can be missing or empty string and so appropriate handling is required
|
||||||
// so that upstream server recieves valid page number.
|
// so that upstream server recieves valid page number.
|
||||||
let url: String = match page {
|
let url: String = match page {
|
||||||
1 | 0 => {
|
0 => {
|
||||||
format!("https://html.duckduckgo.com/html/?q={query}&s=&dc=&v=1&o=json&api=/d.js")
|
format!("https://html.duckduckgo.com/html/?q={query}&s=&dc=&v=1&o=json&api=/d.js")
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
format!(
|
format!(
|
||||||
"https://duckduckgo.com/html/?q={}&s={}&dc={}&v=1&o=json&api=/d.js",
|
"https://duckduckgo.com/html/?q={query}&s={}&dc={}&v=1&o=json&api=/d.js",
|
||||||
query,
|
page * 30,
|
||||||
(page / 2 + (page % 2)) * 30,
|
page * 30 + 1
|
||||||
(page / 2 + (page % 2)) * 30 + 1
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -65,17 +65,10 @@ impl SearchEngine for LibreX {
|
|||||||
) -> Result<HashMap<String, SearchResult>, EngineError> {
|
) -> Result<HashMap<String, SearchResult>, EngineError> {
|
||||||
// Page number can be missing or empty string and so appropriate handling is required
|
// Page number can be missing or empty string and so appropriate handling is required
|
||||||
// so that upstream server recieves valid page number.
|
// so that upstream server recieves valid page number.
|
||||||
let url: String = match page {
|
let url: String = format!(
|
||||||
1 | 0 => {
|
"https://search.ahwx.org/search.php?q={query}&p={}&t=10",
|
||||||
format!("https://search.ahwx.org/search.php?q={query}&p=0&t=10")
|
page * 10
|
||||||
}
|
);
|
||||||
_ => {
|
|
||||||
format!(
|
|
||||||
"https://search.ahwx.org/search.php?q={query}&p={}&t=10",
|
|
||||||
page * 10,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// initializing HeaderMap and adding appropriate headers.
|
// initializing HeaderMap and adding appropriate headers.
|
||||||
let header_map = HeaderMap::try_from(&HashMap::from([
|
let header_map = HeaderMap::try_from(&HashMap::from([
|
||||||
|
@ -3,9 +3,11 @@
|
|||||||
//! provide a standard functions to be implemented for all the upstream search engine handling
|
//! provide a standard functions to be implemented for all the upstream search engine handling
|
||||||
//! code. Moreover, it also provides a custom error for the upstream search engine handling code.
|
//! code. Moreover, it also provides a custom error for the upstream search engine handling code.
|
||||||
|
|
||||||
|
pub mod bing;
|
||||||
pub mod brave;
|
pub mod brave;
|
||||||
pub mod duckduckgo;
|
pub mod duckduckgo;
|
||||||
pub mod librex;
|
pub mod librex;
|
||||||
|
pub mod mojeek;
|
||||||
pub mod search_result_parser;
|
pub mod search_result_parser;
|
||||||
pub mod searx;
|
pub mod searx;
|
||||||
pub mod startpage;
|
pub mod startpage;
|
||||||
|
151
src/engines/mojeek.rs
Normal file
151
src/engines/mojeek.rs
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
//! The `mojeek` module handles the scraping of results from the mojeek search engine
|
||||||
|
//! by querying the upstream mojeek search engine with user provided query and with a page
|
||||||
|
//! number if provided.
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use reqwest::header::HeaderMap;
|
||||||
|
use reqwest::Client;
|
||||||
|
use scraper::Html;
|
||||||
|
|
||||||
|
use crate::models::aggregation_models::SearchResult;
|
||||||
|
|
||||||
|
use crate::models::engine_models::{EngineError, SearchEngine};
|
||||||
|
|
||||||
|
use error_stack::{Report, Result, ResultExt};
|
||||||
|
|
||||||
|
use super::search_result_parser::SearchResultParser;
|
||||||
|
|
||||||
|
/// A new Mojeek engine type defined in-order to implement the `SearchEngine` trait which allows to
|
||||||
|
/// reduce code duplication as well as allows to create vector of different search engines easily.
|
||||||
|
pub struct Mojeek {
|
||||||
|
/// The parser, used to interpret the search result.
|
||||||
|
parser: SearchResultParser,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Mojeek {
|
||||||
|
/// Creates the Mojeek parser.
|
||||||
|
pub fn new() -> Result<Self, EngineError> {
|
||||||
|
Ok(Self {
|
||||||
|
parser: SearchResultParser::new(
|
||||||
|
".result-col",
|
||||||
|
".results-standard li",
|
||||||
|
"a span.url",
|
||||||
|
"h2 a.title",
|
||||||
|
"p.s",
|
||||||
|
)?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl SearchEngine for Mojeek {
|
||||||
|
async fn results(
|
||||||
|
&self,
|
||||||
|
query: &str,
|
||||||
|
page: u32,
|
||||||
|
user_agent: &str,
|
||||||
|
client: &Client,
|
||||||
|
safe_search: u8,
|
||||||
|
) -> Result<HashMap<String, SearchResult>, EngineError> {
|
||||||
|
// Mojeek uses `start results from this number` convention
|
||||||
|
// So, for 10 results per page, page 0 starts at 1, page 1
|
||||||
|
// starts at 11, and so on.
|
||||||
|
let results_per_page = 10;
|
||||||
|
let start_result = results_per_page * page + 1;
|
||||||
|
|
||||||
|
let results_per_page = results_per_page.to_string();
|
||||||
|
let start_result = start_result.to_string();
|
||||||
|
|
||||||
|
let search_engines = vec![
|
||||||
|
"Bing",
|
||||||
|
"Brave",
|
||||||
|
"DuckDuckGo",
|
||||||
|
"Ecosia",
|
||||||
|
"Google",
|
||||||
|
"Lilo",
|
||||||
|
"Metager",
|
||||||
|
"Qwant",
|
||||||
|
"Startpage",
|
||||||
|
"Swisscows",
|
||||||
|
"Yandex",
|
||||||
|
"Yep",
|
||||||
|
"You",
|
||||||
|
];
|
||||||
|
let qss = search_engines.join("%2C");
|
||||||
|
let safe = if safe_search == 0 { "0" } else { "1" };
|
||||||
|
|
||||||
|
// Mojeek detects automated requests, these are preferences that are
|
||||||
|
// able to circumvent the countermeasure. Some of these are
|
||||||
|
// not documented in their Search API
|
||||||
|
let query_params: Vec<(&str, &str)> = vec![
|
||||||
|
("t", results_per_page.as_str()),
|
||||||
|
("theme", "dark"),
|
||||||
|
("arc", "none"),
|
||||||
|
("date", "1"),
|
||||||
|
("cdate", "1"),
|
||||||
|
("tlen", "100"),
|
||||||
|
("ref", "1"),
|
||||||
|
("hp", "minimal"),
|
||||||
|
("lb", "en"),
|
||||||
|
("qss", &qss),
|
||||||
|
("safe", safe),
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut query_params_string = String::new();
|
||||||
|
for (k, v) in &query_params {
|
||||||
|
query_params_string.push_str(&format!("&{k}={v}"));
|
||||||
|
}
|
||||||
|
|
||||||
|
let url: String = match page {
|
||||||
|
0 => {
|
||||||
|
format!("https://www.mojeek.com/search?q={query}{query_params_string}")
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
format!(
|
||||||
|
"https://www.mojeek.com/search?q={query}&s={start_result}{query_params_string}"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut cookie_string = String::new();
|
||||||
|
for (k, v) in &query_params {
|
||||||
|
cookie_string.push_str(&format!("{k}={v}; "));
|
||||||
|
}
|
||||||
|
|
||||||
|
let header_map = HeaderMap::try_from(&HashMap::from([
|
||||||
|
("USER_AGENT".to_string(), user_agent.to_string()),
|
||||||
|
("REFERER".to_string(), "https://google.com/".to_string()),
|
||||||
|
(
|
||||||
|
"CONTENT_TYPE".to_string(),
|
||||||
|
"application/x-www-form-urlencoded".to_string(),
|
||||||
|
),
|
||||||
|
("COOKIE".to_string(), cookie_string),
|
||||||
|
]))
|
||||||
|
.change_context(EngineError::UnexpectedError)?;
|
||||||
|
|
||||||
|
let document: Html = Html::parse_document(
|
||||||
|
&Mojeek::fetch_html_from_upstream(self, &url, header_map, client).await?,
|
||||||
|
);
|
||||||
|
|
||||||
|
if let Some(no_result_msg) = self.parser.parse_for_no_results(&document).nth(0) {
|
||||||
|
if no_result_msg
|
||||||
|
.inner_html()
|
||||||
|
.contains("No pages found matching:")
|
||||||
|
{
|
||||||
|
return Err(Report::new(EngineError::EmptyResultSet));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// scrape all the results from the html
|
||||||
|
self.parser
|
||||||
|
.parse_for_results(&document, |title, url, desc| {
|
||||||
|
Some(SearchResult::new(
|
||||||
|
title.inner_html().trim(),
|
||||||
|
url.inner_html().trim(),
|
||||||
|
desc.inner_html().trim(),
|
||||||
|
&["mojeek"],
|
||||||
|
))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -50,14 +50,10 @@ impl SearchEngine for Searx {
|
|||||||
safe_search = 2;
|
safe_search = 2;
|
||||||
};
|
};
|
||||||
|
|
||||||
let url: String = match page {
|
let url: String = format!(
|
||||||
0 | 1 => {
|
"https://searx.be/search?q={query}&pageno={}&safesearch={safe_search}",
|
||||||
format!("https://searx.be/search?q={query}&pageno=1&safesearch={safe_search}")
|
page + 1
|
||||||
}
|
);
|
||||||
_ => {
|
|
||||||
format!("https://searx.be/search?q={query}&pageno={page}&safesearch={safe_search}")
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// initializing headers and adding appropriate headers.
|
// initializing headers and adding appropriate headers.
|
||||||
let header_map = HeaderMap::try_from(&HashMap::from([
|
let header_map = HeaderMap::try_from(&HashMap::from([
|
||||||
|
@ -50,17 +50,10 @@ impl SearchEngine for Startpage {
|
|||||||
) -> Result<HashMap<String, SearchResult>, EngineError> {
|
) -> Result<HashMap<String, SearchResult>, EngineError> {
|
||||||
// Page number can be missing or empty string and so appropriate handling is required
|
// Page number can be missing or empty string and so appropriate handling is required
|
||||||
// so that upstream server recieves valid page number.
|
// so that upstream server recieves valid page number.
|
||||||
let url: String = match page {
|
let url: String = format!(
|
||||||
1 | 0 => {
|
"https://startpage.com/do/dsearch?q={query}&num=10&start={}",
|
||||||
format!("https://startpage.com/do/dsearch?q={query}&num=10&start=0")
|
page * 10,
|
||||||
}
|
);
|
||||||
_ => {
|
|
||||||
format!(
|
|
||||||
"https://startpage.com/do/dsearch?q={query}&num=10&start={}",
|
|
||||||
page * 10,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// initializing HeaderMap and adding appropriate headers.
|
// initializing HeaderMap and adding appropriate headers.
|
||||||
let header_map = HeaderMap::try_from(&HashMap::from([
|
let header_map = HeaderMap::try_from(&HashMap::from([
|
||||||
|
@ -21,7 +21,12 @@ use crate::server::router;
|
|||||||
use actix_cors::Cors;
|
use actix_cors::Cors;
|
||||||
use actix_files as fs;
|
use actix_files as fs;
|
||||||
use actix_governor::{Governor, GovernorConfigBuilder};
|
use actix_governor::{Governor, GovernorConfigBuilder};
|
||||||
use actix_web::{dev::Server, http::header, middleware::Logger, web, App, HttpServer};
|
use actix_web::{
|
||||||
|
dev::Server,
|
||||||
|
http::header,
|
||||||
|
middleware::{Compress, Logger},
|
||||||
|
web, App, HttpServer,
|
||||||
|
};
|
||||||
use cache::cacher::{Cacher, SharedCache};
|
use cache::cacher::{Cacher, SharedCache};
|
||||||
use config::parser::Config;
|
use config::parser::Config;
|
||||||
use handler::{file_path, FileType};
|
use handler::{file_path, FileType};
|
||||||
@ -73,6 +78,8 @@ pub fn run(
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
App::new()
|
App::new()
|
||||||
|
// Compress the responses provided by the server for the client requests.
|
||||||
|
.wrap(Compress::default())
|
||||||
.wrap(Logger::default()) // added logging middleware for logging.
|
.wrap(Logger::default()) // added logging middleware for logging.
|
||||||
.app_data(web::Data::new(config.clone()))
|
.app_data(web::Data::new(config.clone()))
|
||||||
.app_data(cache.clone())
|
.app_data(cache.clone())
|
||||||
|
@ -162,6 +162,14 @@ impl EngineHandler {
|
|||||||
let engine = crate::engines::librex::LibreX::new()?;
|
let engine = crate::engines::librex::LibreX::new()?;
|
||||||
("librex", Box::new(engine))
|
("librex", Box::new(engine))
|
||||||
}
|
}
|
||||||
|
"mojeek" => {
|
||||||
|
let engine = crate::engines::mojeek::Mojeek::new()?;
|
||||||
|
("mojeek", Box::new(engine))
|
||||||
|
}
|
||||||
|
"bing" => {
|
||||||
|
let engine = crate::engines::bing::Bing::new()?;
|
||||||
|
("bing", Box::new(engine))
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
return Err(Report::from(EngineError::NoSuchEngineFound(
|
return Err(Report::from(EngineError::NoSuchEngineFound(
|
||||||
engine_name.to_string(),
|
engine_name.to_string(),
|
||||||
|
@ -6,13 +6,13 @@ use crate::{
|
|||||||
config::parser::Config,
|
config::parser::Config,
|
||||||
handler::{file_path, FileType},
|
handler::{file_path, FileType},
|
||||||
};
|
};
|
||||||
use actix_web::{get, web, HttpRequest, HttpResponse};
|
use actix_web::{get, http::header::ContentType, web, HttpRequest, HttpResponse};
|
||||||
use std::fs::read_to_string;
|
use std::fs::read_to_string;
|
||||||
|
|
||||||
/// Handles the route of index page or main page of the `websurfx` meta search engine website.
|
/// Handles the route of index page or main page of the `websurfx` meta search engine website.
|
||||||
#[get("/")]
|
#[get("/")]
|
||||||
pub async fn index(config: web::Data<Config>) -> Result<HttpResponse, Box<dyn std::error::Error>> {
|
pub async fn index(config: web::Data<Config>) -> Result<HttpResponse, Box<dyn std::error::Error>> {
|
||||||
Ok(HttpResponse::Ok().body(
|
Ok(HttpResponse::Ok().content_type(ContentType::html()).body(
|
||||||
crate::templates::views::index::index(
|
crate::templates::views::index::index(
|
||||||
&config.style.colorscheme,
|
&config.style.colorscheme,
|
||||||
&config.style.theme,
|
&config.style.theme,
|
||||||
@ -27,16 +27,14 @@ pub async fn index(config: web::Data<Config>) -> Result<HttpResponse, Box<dyn st
|
|||||||
pub async fn not_found(
|
pub async fn not_found(
|
||||||
config: web::Data<Config>,
|
config: web::Data<Config>,
|
||||||
) -> Result<HttpResponse, Box<dyn std::error::Error>> {
|
) -> Result<HttpResponse, Box<dyn std::error::Error>> {
|
||||||
Ok(HttpResponse::Ok()
|
Ok(HttpResponse::Ok().content_type(ContentType::html()).body(
|
||||||
.content_type("text/html; charset=utf-8")
|
crate::templates::views::not_found::not_found(
|
||||||
.body(
|
&config.style.colorscheme,
|
||||||
crate::templates::views::not_found::not_found(
|
&config.style.theme,
|
||||||
&config.style.colorscheme,
|
&config.style.animation,
|
||||||
&config.style.theme,
|
)
|
||||||
&config.style.animation,
|
.0,
|
||||||
)
|
))
|
||||||
.0,
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Handles the route of robots.txt page of the `websurfx` meta search engine website.
|
/// Handles the route of robots.txt page of the `websurfx` meta search engine website.
|
||||||
@ -45,14 +43,14 @@ pub async fn robots_data(_req: HttpRequest) -> Result<HttpResponse, Box<dyn std:
|
|||||||
let page_content: String =
|
let page_content: String =
|
||||||
read_to_string(format!("{}/robots.txt", file_path(FileType::Theme)?))?;
|
read_to_string(format!("{}/robots.txt", file_path(FileType::Theme)?))?;
|
||||||
Ok(HttpResponse::Ok()
|
Ok(HttpResponse::Ok()
|
||||||
.content_type("text/plain; charset=ascii")
|
.content_type(ContentType::plaintext())
|
||||||
.body(page_content))
|
.body(page_content))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Handles the route of about page of the `websurfx` meta search engine website.
|
/// Handles the route of about page of the `websurfx` meta search engine website.
|
||||||
#[get("/about")]
|
#[get("/about")]
|
||||||
pub async fn about(config: web::Data<Config>) -> Result<HttpResponse, Box<dyn std::error::Error>> {
|
pub async fn about(config: web::Data<Config>) -> Result<HttpResponse, Box<dyn std::error::Error>> {
|
||||||
Ok(HttpResponse::Ok().body(
|
Ok(HttpResponse::Ok().content_type(ContentType::html()).body(
|
||||||
crate::templates::views::about::about(
|
crate::templates::views::about::about(
|
||||||
&config.style.colorscheme,
|
&config.style.colorscheme,
|
||||||
&config.style.theme,
|
&config.style.theme,
|
||||||
@ -67,15 +65,13 @@ pub async fn about(config: web::Data<Config>) -> Result<HttpResponse, Box<dyn st
|
|||||||
pub async fn settings(
|
pub async fn settings(
|
||||||
config: web::Data<Config>,
|
config: web::Data<Config>,
|
||||||
) -> Result<HttpResponse, Box<dyn std::error::Error>> {
|
) -> Result<HttpResponse, Box<dyn std::error::Error>> {
|
||||||
Ok(HttpResponse::Ok().body(
|
Ok(HttpResponse::Ok().content_type(ContentType::html()).body(
|
||||||
crate::templates::views::settings::settings(
|
crate::templates::views::settings::settings(
|
||||||
|
config.safe_search,
|
||||||
&config.style.colorscheme,
|
&config.style.colorscheme,
|
||||||
&config.style.theme,
|
&config.style.theme,
|
||||||
&config.style.animation,
|
&config.style.animation,
|
||||||
&config
|
&config.upstream_search_engines,
|
||||||
.upstream_search_engines
|
|
||||||
.keys()
|
|
||||||
.collect::<Vec<&String>>(),
|
|
||||||
)?
|
)?
|
||||||
.0,
|
.0,
|
||||||
))
|
))
|
||||||
|
@ -11,7 +11,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
results::aggregator::aggregate,
|
results::aggregator::aggregate,
|
||||||
};
|
};
|
||||||
use actix_web::{get, web, HttpRequest, HttpResponse};
|
use actix_web::{get, http::header::ContentType, web, HttpRequest, HttpResponse};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use std::{
|
use std::{
|
||||||
fs::File,
|
fs::File,
|
||||||
@ -59,16 +59,16 @@ pub async fn search(
|
|||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
// .max(1) makes sure that the page > 0.
|
// .max(1) makes sure that the page >= 0.
|
||||||
let page = params.page.unwrap_or(1).max(1);
|
let page = params.page.unwrap_or(1).max(1) - 1;
|
||||||
|
|
||||||
let (_, results, _) = join!(
|
let (_, results, _) = join!(
|
||||||
get_results(page - 1),
|
get_results(page.saturating_sub(1)),
|
||||||
get_results(page),
|
get_results(page),
|
||||||
get_results(page + 1)
|
get_results(page + 1)
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(HttpResponse::Ok().body(
|
Ok(HttpResponse::Ok().content_type(ContentType::html()).body(
|
||||||
crate::templates::views::search::search(
|
crate::templates::views::search::search(
|
||||||
&config.style.colorscheme,
|
&config.style.colorscheme,
|
||||||
&config.style.theme,
|
&config.style.theme,
|
||||||
|
@ -16,6 +16,8 @@ pub fn bar(query: &str) -> Markup {
|
|||||||
html!(
|
html!(
|
||||||
(PreEscaped("<div class=\"search_bar\">"))
|
(PreEscaped("<div class=\"search_bar\">"))
|
||||||
input type="search" name="search-box" value=(query) placeholder="Type to search";
|
input type="search" name="search-box" value=(query) placeholder="Type to search";
|
||||||
button type="submit" onclick="searchWeb()"{"search"}
|
button type="submit" onclick="searchWeb()" {
|
||||||
|
img src="./images/magnifying_glass.svg" alt="Info icon for error box";
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,20 @@
|
|||||||
//! A module that handles the engines tab for setting page view in the `websurfx` frontend.
|
//! A module that handles the engines tab for setting page view in the `websurfx` frontend.
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use maud::{html, Markup};
|
use maud::{html, Markup};
|
||||||
|
|
||||||
/// A functions that handles the html code for the engines tab for the settings page for the search page.
|
/// A functions that handles the html code for the engines tab for the settings page for the search page.
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
///
|
///
|
||||||
/// * `engine_names` - It takes the list of all available engine names as an argument.
|
/// * `engine_names` - It takes the key value pair list of all available engine names and there corresponding
|
||||||
|
/// selected (enabled/disabled) value as an argument.
|
||||||
///
|
///
|
||||||
/// # Returns
|
/// # Returns
|
||||||
///
|
///
|
||||||
/// It returns the compiled html markup code for the engines tab.
|
/// It returns the compiled html markup code for the engines tab.
|
||||||
pub fn engines(engine_names: &[&String]) -> Markup {
|
pub fn engines(engine_names: &HashMap<String, bool>) -> Markup {
|
||||||
html!(
|
html!(
|
||||||
div class="engines tab"{
|
div class="engines tab"{
|
||||||
h1{"Engines"}
|
h1{"Engines"}
|
||||||
@ -20,21 +23,49 @@ pub fn engines(engine_names: &[&String]) -> Markup {
|
|||||||
"Select the search engines from the list of engines that you want results from"
|
"Select the search engines from the list of engines that you want results from"
|
||||||
}
|
}
|
||||||
.engine_selection{
|
.engine_selection{
|
||||||
.toggle_btn{
|
// Checks whether all the engines are selected or not if they are then the
|
||||||
label class="switch"{
|
// checked `select_all` button is rendered otherwise the unchecked version
|
||||||
input type="checkbox" class="select_all" onchange="toggleAllSelection()";
|
// is rendered.
|
||||||
span class="slider round"{}
|
@if engine_names.values().all(|selected| *selected){
|
||||||
}
|
.toggle_btn{
|
||||||
"Select All"
|
label class="switch"{
|
||||||
|
input type="checkbox" class="select_all" onchange="toggleAllSelection()" checked;
|
||||||
|
span class="slider round"{}
|
||||||
|
}
|
||||||
|
"Select All"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@else{
|
||||||
|
.toggle_btn {
|
||||||
|
label class="switch"{
|
||||||
|
input type="checkbox" class="select_all" onchange="toggleAllSelection()";
|
||||||
|
span class="slider round"{}
|
||||||
|
}
|
||||||
|
"Select All"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
hr;
|
hr;
|
||||||
@for engine_name in engine_names{
|
@for (engine_name, selected) in engine_names{
|
||||||
.toggle_btn{
|
// Checks whether the `engine_name` is selected or not if they are then the
|
||||||
label class="switch"{
|
// checked `engine` button is rendered otherwise the unchecked version is
|
||||||
input type="checkbox" class="engine";
|
// rendered.
|
||||||
span class="slider round"{}
|
@if *selected {
|
||||||
|
.toggle_btn{
|
||||||
|
label class="switch"{
|
||||||
|
input type="checkbox" class="engine" checked;
|
||||||
|
span class="slider round"{}
|
||||||
|
}
|
||||||
|
(format!("{}{}",engine_name[..1].to_uppercase().to_owned(), engine_name[1..].to_owned()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
.toggle_btn {
|
||||||
|
label class="switch"{
|
||||||
|
input type="checkbox" class="engine";
|
||||||
|
span class="slider round"{}
|
||||||
|
}
|
||||||
|
(format!("{}{}",engine_name[..1].to_uppercase().to_owned(), engine_name[1..].to_owned()))
|
||||||
}
|
}
|
||||||
(format!("{}{}",engine_name[..1].to_uppercase().to_owned(), engine_name[1..].to_owned()))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,10 +7,14 @@ const SAFE_SEARCH_LEVELS: [(u8, &str); 3] = [(0, "None"), (1, "Low"), (2, "Moder
|
|||||||
|
|
||||||
/// A functions that handles the html code for the general tab for the settings page for the search page.
|
/// A functions that handles the html code for the general tab for the settings page for the search page.
|
||||||
///
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `safe_search_level` - It takes the safe search level as an argument.
|
||||||
|
///
|
||||||
/// # Returns
|
/// # Returns
|
||||||
///
|
///
|
||||||
/// It returns the compiled html markup code for the general tab.
|
/// It returns the compiled html markup code for the general tab.
|
||||||
pub fn general() -> Markup {
|
pub fn general(safe_search_level: u8) -> Markup {
|
||||||
html!(
|
html!(
|
||||||
div class="general tab active"{
|
div class="general tab active"{
|
||||||
h1{"General"}
|
h1{"General"}
|
||||||
@ -18,9 +22,19 @@ pub fn general() -> Markup {
|
|||||||
p class="description"{
|
p class="description"{
|
||||||
"Select a safe search level from the menu below to filter content based on the level."
|
"Select a safe search level from the menu below to filter content based on the level."
|
||||||
}
|
}
|
||||||
select name="safe_search_levels"{
|
@if safe_search_level < 3 {
|
||||||
@for (k,v) in SAFE_SEARCH_LEVELS{
|
select name="safe_search_levels" {
|
||||||
option value=(k){(v)}
|
// Sets the user selected safe_search_level name from the config file as the first option in the selection list.
|
||||||
|
option value=(safe_search_level){(SAFE_SEARCH_LEVELS.iter().find(|level| level.0 == safe_search_level).unwrap().1)}
|
||||||
|
@for (k,v) in SAFE_SEARCH_LEVELS.iter().filter(|level| level.0 != safe_search_level){
|
||||||
|
option value=(k){(v)}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
p class="admin_warning" {"⚠️ This setting is being managed by the server administrator."}
|
||||||
|
select name="safe_search_levels" disabled {
|
||||||
|
option value=(SAFE_SEARCH_LEVELS[2].0){(SAFE_SEARCH_LEVELS[2].1)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,16 @@ use crate::handler::{file_path, FileType};
|
|||||||
use maud::{html, Markup};
|
use maud::{html, Markup};
|
||||||
use std::fs::read_dir;
|
use std::fs::read_dir;
|
||||||
|
|
||||||
/// A helper function that helps in building the list of all available colorscheme/theme names
|
/// A helper function that helps in building the list of all available colorscheme/theme/animation
|
||||||
/// present in the colorschemes and themes folder respectively.
|
/// names present in the colorschemes, animations and themes folder respectively by excluding the
|
||||||
|
/// ones that have already been selected via the config file.
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
///
|
///
|
||||||
/// * `style_type` - It takes the style type of the values `theme` and `colorscheme` as an
|
/// * `style_type` - It takes the style type of the values `theme` and `colorscheme` as an
|
||||||
/// argument.
|
/// argument.
|
||||||
|
/// * `selected_style` - It takes the currently selected style value provided via the config file
|
||||||
|
/// as an argument.
|
||||||
///
|
///
|
||||||
/// # Error
|
/// # Error
|
||||||
///
|
///
|
||||||
@ -18,7 +21,8 @@ use std::fs::read_dir;
|
|||||||
/// returns a standard error message.
|
/// returns a standard error message.
|
||||||
fn style_option_list(
|
fn style_option_list(
|
||||||
style_type: &str,
|
style_type: &str,
|
||||||
) -> Result<Vec<(String, String)>, Box<dyn std::error::Error + '_>> {
|
selected_style: &str,
|
||||||
|
) -> Result<Vec<(String, String)>, Box<dyn std::error::Error>> {
|
||||||
let mut style_option_names: Vec<(String, String)> = Vec::new();
|
let mut style_option_names: Vec<(String, String)> = Vec::new();
|
||||||
for file in read_dir(format!(
|
for file in read_dir(format!(
|
||||||
"{}static/{}/",
|
"{}static/{}/",
|
||||||
@ -26,7 +30,13 @@ fn style_option_list(
|
|||||||
style_type,
|
style_type,
|
||||||
))? {
|
))? {
|
||||||
let style_name = file?.file_name().to_str().unwrap().replace(".css", "");
|
let style_name = file?.file_name().to_str().unwrap().replace(".css", "");
|
||||||
style_option_names.push((style_name.clone(), style_name.replace('-', " ")));
|
if selected_style != style_name {
|
||||||
|
style_option_names.push((style_name.clone(), style_name.replace('-', " ")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if style_type == "animations" {
|
||||||
|
style_option_names.push(("".to_owned(), "none".to_owned()))
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(style_option_names)
|
Ok(style_option_names)
|
||||||
@ -38,7 +48,11 @@ fn style_option_list(
|
|||||||
///
|
///
|
||||||
/// It returns the compiled html markup code for the user interface tab on success otherwise
|
/// It returns the compiled html markup code for the user interface tab on success otherwise
|
||||||
/// returns a standard error message.
|
/// returns a standard error message.
|
||||||
pub fn user_interface() -> Result<Markup, Box<dyn std::error::Error>> {
|
pub fn user_interface(
|
||||||
|
theme: &str,
|
||||||
|
colorscheme: &str,
|
||||||
|
animation: &Option<String>,
|
||||||
|
) -> Result<Markup, Box<dyn std::error::Error>> {
|
||||||
Ok(html!(
|
Ok(html!(
|
||||||
div class="user_interface tab"{
|
div class="user_interface tab"{
|
||||||
h1{"User Interface"}
|
h1{"User Interface"}
|
||||||
@ -47,7 +61,9 @@ pub fn user_interface() -> Result<Markup, Box<dyn std::error::Error>> {
|
|||||||
"Select the theme from the available themes to be used in user interface"
|
"Select the theme from the available themes to be used in user interface"
|
||||||
}
|
}
|
||||||
select name="themes"{
|
select name="themes"{
|
||||||
@for (k,v) in style_option_list("themes")?{
|
// Sets the user selected theme name from the config file as the first option in the selection list.
|
||||||
|
option value=(theme){(theme.replace('-', " "))}
|
||||||
|
@for (k,v) in style_option_list("themes", theme)?{
|
||||||
option value=(k){(v)}
|
option value=(k){(v)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -56,7 +72,9 @@ pub fn user_interface() -> Result<Markup, Box<dyn std::error::Error>> {
|
|||||||
"Select the color scheme for your theme to be used in user interface"
|
"Select the color scheme for your theme to be used in user interface"
|
||||||
}
|
}
|
||||||
select name="colorschemes"{
|
select name="colorschemes"{
|
||||||
@for (k,v) in style_option_list("colorschemes")?{
|
// Sets the user selected colorscheme name from the config file as the first option in the selection list.
|
||||||
|
option value=(colorscheme){(colorscheme.replace('-', " "))}
|
||||||
|
@for (k,v) in style_option_list("colorschemes", colorscheme)?{
|
||||||
option value=(k){(v)}
|
option value=(k){(v)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -65,12 +83,12 @@ pub fn user_interface() -> Result<Markup, Box<dyn std::error::Error>> {
|
|||||||
"Select the animation for your theme to be used in user interface"
|
"Select the animation for your theme to be used in user interface"
|
||||||
}
|
}
|
||||||
select name="animations"{
|
select name="animations"{
|
||||||
option value=""{"none"}
|
// Sets the user selected animation name from the config file as the first option in the selection list.
|
||||||
@for (k,v) in style_option_list("animations")?{
|
option value=(animation.as_ref().unwrap_or(&"".to_owned())){(animation.as_ref().unwrap_or(&"".to_owned()).replace('-'," "))}
|
||||||
|
@for (k,v) in style_option_list("animations", animation.as_ref().unwrap_or(&"".to_owned()))?{
|
||||||
option value=(k){(v)}
|
option value=(k){(v)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
//! A module that handles the view for the settings page in the `websurfx` frontend.
|
//! A module that handles the view for the settings page in the `websurfx` frontend.
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use maud::{html, Markup};
|
use maud::{html, Markup};
|
||||||
|
|
||||||
use crate::templates::partials::{
|
use crate::templates::partials::{
|
||||||
@ -14,8 +16,10 @@ use crate::templates::partials::{
|
|||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
///
|
///
|
||||||
|
/// * `safe_search_level` - It takes the safe search level as an argument.
|
||||||
/// * `colorscheme` - It takes the colorscheme name as an argument.
|
/// * `colorscheme` - It takes the colorscheme name as an argument.
|
||||||
/// * `theme` - It takes the theme name as an argument.
|
/// * `theme` - It takes the theme name as an argument.
|
||||||
|
/// * `animation` - It takes the animation name as an argument.
|
||||||
/// * `engine_names` - It takes a list of engine names as an argument.
|
/// * `engine_names` - It takes a list of engine names as an argument.
|
||||||
///
|
///
|
||||||
/// # Error
|
/// # Error
|
||||||
@ -23,10 +27,11 @@ use crate::templates::partials::{
|
|||||||
/// This function returns a compiled html markup code on success otherwise returns a standard error
|
/// This function returns a compiled html markup code on success otherwise returns a standard error
|
||||||
/// message.
|
/// message.
|
||||||
pub fn settings(
|
pub fn settings(
|
||||||
|
safe_search_level: u8,
|
||||||
colorscheme: &str,
|
colorscheme: &str,
|
||||||
theme: &str,
|
theme: &str,
|
||||||
animation: &Option<String>,
|
animation: &Option<String>,
|
||||||
engine_names: &[&String],
|
engine_names: &HashMap<String, bool>,
|
||||||
) -> Result<Markup, Box<dyn std::error::Error>> {
|
) -> Result<Markup, Box<dyn std::error::Error>> {
|
||||||
Ok(html!(
|
Ok(html!(
|
||||||
(header(colorscheme, theme, animation))
|
(header(colorscheme, theme, animation))
|
||||||
@ -41,8 +46,8 @@ pub fn settings(
|
|||||||
.btn onclick="setActiveTab(this)"{"cookies"}
|
.btn onclick="setActiveTab(this)"{"cookies"}
|
||||||
}
|
}
|
||||||
.main_container{
|
.main_container{
|
||||||
(general())
|
(general(safe_search_level))
|
||||||
(user_interface()?)
|
(user_interface(theme, colorscheme, animation)?)
|
||||||
(engines(engine_names))
|
(engines(engine_names))
|
||||||
(cookies())
|
(cookies())
|
||||||
p class="message"{}
|
p class="message"{}
|
||||||
|
@ -64,4 +64,6 @@ upstream_search_engines = {
|
|||||||
Brave = false,
|
Brave = false,
|
||||||
Startpage = false,
|
Startpage = false,
|
||||||
LibreX = false,
|
LibreX = false,
|
||||||
|
Mojeek = false,
|
||||||
|
Bing = false,
|
||||||
} -- select the upstream search engines from which the results should be fetched.
|
} -- select the upstream search engines from which the results should be fetched.
|
||||||
|
Loading…
Reference in New Issue
Block a user