mirror of
https://codeberg.org/LibRedirect/libredirect.git
synced 2025-02-10 00:50:51 +01:00
Supporting Frontends Manager better + A small fix
This commit is contained in:
parent
23583df422
commit
dc748e8336
29
README.md
29
README.md
@ -1,48 +1,51 @@
|
|||||||
<img src="./img/libredirect_full.svg" height="50"/>
|
<img src="./img/libredirect_full.svg" height="50"/>
|
||||||
|
|
||||||
A web extension that redirects YouTube, Twitter, TikTok... requests to alternative privacy friendly frontends and backends.
|
A browser extension that redirects YouTube, Twitter, TikTok... requests to alternative privacy friendly frontends and backends.
|
||||||
|
|
||||||
[![Firefox Add-on](./img/badge-amo.png)](https://addons.mozilla.org/firefox/addon/libredirect/)
|
<a href="https://addons.mozilla.org/firefox/addon/libredirect/">
|
||||||
|
<img src ="./img/badge-amo.png" height=60 >
|
||||||
|
</a>
|
||||||
|
|
||||||
<a href="https://libredirect.github.io/download_chromium.html">
|
<a href="https://libredirect.github.io/download_chromium.html">
|
||||||
<img src ="./img/badge-chromium.png" height=60 >
|
<img src ="./img/badge-chromium.png" height=60 >
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
## Translate
|
## Translate
|
||||||
|
<a href="https://hosted.weblate.org/projects/libredirect/extension">
|
||||||
[![Weblate](./img/weblate.svg)](https://hosted.weblate.org/projects/libredirect/extension)
|
<img src ="./img/weblate.svg">
|
||||||
|
</a>
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
Requirements: [Node.js LTS](https://nodejs.org/)
|
Install [Node.js](https://nodejs.org/)
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/libredirect/browser_extension
|
git clone https://github.com/libredirect/browser_extension
|
||||||
cd browser_extension
|
cd browser_extension
|
||||||
npm install
|
npm install
|
||||||
npm run html # Generates html files using Pug
|
npm run html # Generates html using Pug
|
||||||
npm run start # Runs in debug mode in firefox using Web-ext
|
npm run start # Runs in firefox in debug mode using Web-ext
|
||||||
```
|
```
|
||||||
### Run on Chromium manually
|
### Build and Run on Chromium manually
|
||||||
1. Open `chrome://extensions`
|
1. Open `chrome://extensions`
|
||||||
2. Enable `dev mode`
|
2. Enable `dev mode`
|
||||||
3. Select `load unpacked extension`
|
3. Select `load unpacked extension`
|
||||||
4. Select `src` folder
|
4. Select `src` folder
|
||||||
|
|
||||||
### Build zip package (Firefox)
|
### Build a zip package for Firefox
|
||||||
```bash
|
```bash
|
||||||
npm run build
|
npm run build
|
||||||
```
|
```
|
||||||
### Install zip package on Firefox (temporarily)
|
### Install the zip package on Firefox (temporarily)
|
||||||
3. Type in the address bar: `about:debugging#/runtime/this-firefox`
|
3. Type in the address bar: `about:debugging#/runtime/this-firefox`
|
||||||
4. Press `Load Temporary Add-on...`
|
4. Press `Load Temporary Add-on...`
|
||||||
5. Select `libredirect-VERSION.zip` from `web-ext-artifacts` folder
|
5. Select `libredirect-VERSION.zip` from `web-ext-artifacts` folder
|
||||||
|
|
||||||
### Install zip package on Firefox ESR, Developer Edition, Nightly
|
### Install the zip package on Firefox ESR, Developer Edition, Nightly
|
||||||
3. Type in the address bar: `about:config`
|
3. Type in the address bar: `about:config`
|
||||||
4. Set `xpinstall.signatures.required` to `false`
|
4. Set `xpinstall.signatures.required` to `false`
|
||||||
5. Type in the address bar: `about:addons`
|
5. Type in the address bar: `about:addons`
|
||||||
6. Click on the gear shaped `settings` button and select `Install Add-on From File...`
|
6. Click on the gear shaped `settings` button and select `Install Add-on From File...`
|
||||||
7. Select `libredirect-VERSION.zip` from `web-ext-artifacts` folder
|
7. Select `libredirect-VERSION.zip` from `web-ext-artifacts` folder
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Forked from [Privacy Redirect](https://github.com/SimonBrazell/privacy-redirect)
|
Forked from [Privacy Redirect](https://github.com/SimonBrazell/privacy-redirect)
|
||||||
|
@ -56,7 +56,7 @@ function redirect(url, type, initiator, forceRedirection) {
|
|||||||
for (const service in config.services) {
|
for (const service in config.services) {
|
||||||
if (!forceRedirection && !options[service].enabled) continue
|
if (!forceRedirection && !options[service].enabled) continue
|
||||||
|
|
||||||
frontend = options[service].frontend ?? Object.keys(config.services[service].frontends)[0]
|
frontend = options[service].frontend
|
||||||
|
|
||||||
if (!regexArray(service, url, config, frontend)) {
|
if (!regexArray(service, url, config, frontend)) {
|
||||||
frontend = null
|
frontend = null
|
||||||
@ -210,7 +210,6 @@ function redirect(url, type, initiator, forceRedirection) {
|
|||||||
.replace("tl", "target")
|
.replace("tl", "target")
|
||||||
.replace("text", "q")
|
.replace("text", "q")
|
||||||
return `${randomInstance}/${search}`
|
return `${randomInstance}/${search}`
|
||||||
|
|
||||||
}
|
}
|
||||||
case "lingva": {
|
case "lingva": {
|
||||||
let params_arr = url.search.split("&")
|
let params_arr = url.search.split("&")
|
||||||
@ -623,7 +622,7 @@ function switchInstance(url) {
|
|||||||
|
|
||||||
const protocolHost = utils.protocolHost(url)
|
const protocolHost = utils.protocolHost(url)
|
||||||
for (const service in config.services) {
|
for (const service in config.services) {
|
||||||
let frontend = options[service].frontend ?? Object.keys(config.services[service].frontends)[0]
|
let frontend = options[service].frontend
|
||||||
let instancesList = options[frontend]
|
let instancesList = options[frontend]
|
||||||
if (instancesList === undefined) continue
|
if (instancesList === undefined) continue
|
||||||
if (!instancesList.includes(protocolHost)) continue
|
if (!instancesList.includes(protocolHost)) continue
|
||||||
@ -650,7 +649,7 @@ function reverse(url) {
|
|||||||
|
|
||||||
let protocolHost = utils.protocolHost(url)
|
let protocolHost = utils.protocolHost(url)
|
||||||
for (const service in config.services) {
|
for (const service in config.services) {
|
||||||
let frontend = options[service].frontend ?? Object.keys(config.services[service].frontends)[0]
|
let frontend = options[service].frontend
|
||||||
if (options[frontend] == undefined) continue
|
if (options[frontend] == undefined) continue
|
||||||
if (!options[frontend].includes(protocolHost)) continue
|
if (!options[frontend].includes(protocolHost)) continue
|
||||||
|
|
||||||
|
@ -150,6 +150,7 @@
|
|||||||
"enabled": false,
|
"enabled": false,
|
||||||
"redirectType": "main_frame",
|
"redirectType": "main_frame",
|
||||||
"unsupportedUrls": "bypass",
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "nitter",
|
||||||
"instance": "public"
|
"instance": "public"
|
||||||
},
|
},
|
||||||
"imageType": "png",
|
"imageType": "png",
|
||||||
@ -171,7 +172,9 @@
|
|||||||
"name": "TikTok",
|
"name": "TikTok",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "proxiTok",
|
||||||
|
"instance": "public"
|
||||||
},
|
},
|
||||||
"imageType": "png",
|
"imageType": "png",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -224,6 +227,7 @@
|
|||||||
"enabled": false,
|
"enabled": false,
|
||||||
"redirectType": "main_frame",
|
"redirectType": "main_frame",
|
||||||
"unsupportedUrls": "bypass",
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "rimgo",
|
||||||
"instance": "public"
|
"instance": "public"
|
||||||
},
|
},
|
||||||
"imageType": "png",
|
"imageType": "png",
|
||||||
@ -289,7 +293,9 @@
|
|||||||
"name": "Quora",
|
"name": "Quora",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "quetre",
|
||||||
|
"instance": "public"
|
||||||
},
|
},
|
||||||
"imageType": "png",
|
"imageType": "png",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -310,7 +316,9 @@
|
|||||||
"name": "IMDb",
|
"name": "IMDb",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "libremdb",
|
||||||
|
"instance": "public"
|
||||||
},
|
},
|
||||||
"imageType": "svg",
|
"imageType": "svg",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -331,7 +339,8 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass",
|
"unsupportedUrls": "bypass",
|
||||||
"instance": "public"
|
"instance": "public",
|
||||||
|
"frontend": "breezeWiki"
|
||||||
},
|
},
|
||||||
"imageType": "svg",
|
"imageType": "svg",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -354,7 +363,8 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"redirectType": "main_frame",
|
"redirectType": "main_frame",
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "lbryDesktop"
|
||||||
},
|
},
|
||||||
"imageType": "png",
|
"imageType": "png",
|
||||||
"embeddable": true,
|
"embeddable": true,
|
||||||
@ -391,7 +401,8 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"frontend": "searxng",
|
"frontend": "searxng",
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"instance": "public"
|
||||||
},
|
},
|
||||||
"imageType": "svgMono",
|
"imageType": "svgMono",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -475,7 +486,8 @@
|
|||||||
"name": "Send Files",
|
"name": "Send Files",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "send"
|
||||||
},
|
},
|
||||||
"imageType": "svgMono",
|
"imageType": "svgMono",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -495,7 +507,8 @@
|
|||||||
"name": "Paste Text",
|
"name": "Paste Text",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "privateBin"
|
||||||
},
|
},
|
||||||
"imageType": "svgMono",
|
"imageType": "svgMono",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -515,7 +528,8 @@
|
|||||||
"name": "Reuters",
|
"name": "Reuters",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "neuters"
|
||||||
},
|
},
|
||||||
"imageType": "svg",
|
"imageType": "svg",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -536,7 +550,9 @@
|
|||||||
"name": "Genius",
|
"name": "Genius",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "dumb",
|
||||||
|
"instance": "public"
|
||||||
},
|
},
|
||||||
"imageType": "svg",
|
"imageType": "svg",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -556,7 +572,8 @@
|
|||||||
"name": "Urban Dictionary",
|
"name": "Urban Dictionary",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "ruralDictionary"
|
||||||
},
|
},
|
||||||
"imageType": "svg",
|
"imageType": "svg",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -578,7 +595,9 @@
|
|||||||
"name": "Stack Overflow",
|
"name": "Stack Overflow",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "anonymousOverflow",
|
||||||
|
"instance": "public"
|
||||||
},
|
},
|
||||||
"imageType": "svgMono",
|
"imageType": "svgMono",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -599,7 +618,9 @@
|
|||||||
"name": "Goodreads",
|
"name": "Goodreads",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "biblioReads",
|
||||||
|
"instance": "public"
|
||||||
},
|
},
|
||||||
"imageType": "svgMono",
|
"imageType": "svgMono",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -619,7 +640,8 @@
|
|||||||
"name": "Wikipedia",
|
"name": "Wikipedia",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "wikiless"
|
||||||
},
|
},
|
||||||
"imageType": "svg",
|
"imageType": "svg",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -639,7 +661,8 @@
|
|||||||
"name": "Snopes",
|
"name": "Snopes",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "suds"
|
||||||
},
|
},
|
||||||
"imageType": "svg",
|
"imageType": "svg",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -659,7 +682,8 @@
|
|||||||
"name": "Wayback Machine",
|
"name": "Wayback Machine",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "waybackClassic"
|
||||||
},
|
},
|
||||||
"imageType": "svgMono",
|
"imageType": "svgMono",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -679,7 +703,8 @@
|
|||||||
"name": "GitHub",
|
"name": "GitHub",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "gothub"
|
||||||
},
|
},
|
||||||
"imageType": "svgMono",
|
"imageType": "svgMono",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -700,7 +725,8 @@
|
|||||||
"name": "Bilibili",
|
"name": "Bilibili",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "mikuInvidious"
|
||||||
},
|
},
|
||||||
"imageType": "svgMono",
|
"imageType": "svgMono",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -721,7 +747,8 @@
|
|||||||
"name": "Bandcamp",
|
"name": "Bandcamp",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "tent"
|
||||||
},
|
},
|
||||||
"imageType": "svg",
|
"imageType": "svg",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
@ -741,7 +768,8 @@
|
|||||||
"name": "WolframAlpha",
|
"name": "WolframAlpha",
|
||||||
"options": {
|
"options": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"unsupportedUrls": "bypass"
|
"unsupportedUrls": "bypass",
|
||||||
|
"frontend": "wolfreeAlpha"
|
||||||
},
|
},
|
||||||
"imageType": "svg",
|
"imageType": "svg",
|
||||||
"embeddable": false,
|
"embeddable": false,
|
||||||
|
@ -53,8 +53,8 @@ browser.webRequest.onBeforeRequest.addListener(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!newUrl) {
|
if (!newUrl) {
|
||||||
const match = url.href.match(/^https?:\/{2}(.*)\.libredirect\.invalid.*/)
|
const match = url.href.match(/^https?:\/{2}.*\.libredirect\.invalid.*/)
|
||||||
if (match[1]) {
|
if (match) {
|
||||||
browser.tabs.update({
|
browser.tabs.update({
|
||||||
url: browser.runtime.getURL(`/pages/messages/no_instance.html`)
|
url: browser.runtime.getURL(`/pages/messages/no_instance.html`)
|
||||||
});
|
});
|
||||||
|
@ -35,8 +35,10 @@ async function changeFrontendsSettings(service) {
|
|||||||
if (typeof divs[service].frontend !== "undefined") {
|
if (typeof divs[service].frontend !== "undefined") {
|
||||||
if (frontend == divs[service].frontend.value) {
|
if (frontend == divs[service].frontend.value) {
|
||||||
frontendDiv.style.display = ""
|
frontendDiv.style.display = ""
|
||||||
if (config.services[service].frontends[frontend].localhost == true) {
|
console.log(config.services[service].frontends[frontend].localhost)
|
||||||
|
if (config.services[service].frontends[frontend].localhost === true) {
|
||||||
document.getElementById(`${service}-instance-div`).style.display = ""
|
document.getElementById(`${service}-instance-div`).style.display = ""
|
||||||
|
|
||||||
if (options[service].instance == "localhost") {
|
if (options[service].instance == "localhost") {
|
||||||
frontendDiv.style.display = "none"
|
frontendDiv.style.display = "none"
|
||||||
}
|
}
|
||||||
@ -50,7 +52,8 @@ async function changeFrontendsSettings(service) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (document.getElementById(`${service}-redirectType`)) {
|
if (document.getElementById(`${service}-redirectType`)) {
|
||||||
const frontend = options[service].frontend ?? Object.keys(config.services[service].frontends)[0]
|
const frontend = options[service].frontend
|
||||||
|
console.log(frontend)
|
||||||
if (config.services[service].frontends[frontend].embeddable) {
|
if (config.services[service].frontends[frontend].embeddable) {
|
||||||
document.getElementById(`${service}-redirectType`).innerHTML = `
|
document.getElementById(`${service}-redirectType`).innerHTML = `
|
||||||
<option value="both" data-localise="__MSG_both__">both</options>
|
<option value="both" data-localise="__MSG_both__">both</options>
|
||||||
@ -59,19 +62,14 @@ async function changeFrontendsSettings(service) {
|
|||||||
`
|
`
|
||||||
document.getElementById(`${service}-redirectType`).value = options[frontend].redirectType = options[service].redirectType
|
document.getElementById(`${service}-redirectType`).value = options[frontend].redirectType = options[service].redirectType
|
||||||
} else {
|
} else {
|
||||||
document.getElementById(`${service}-redirectType`).innerHTML = `
|
document.getElementById(`${service}-redirectType`).innerHTML =
|
||||||
<option value="main_frame" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>
|
'<option value="main_frame" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>'
|
||||||
`
|
|
||||||
options[service].redirectType = "main_frame"
|
options[service].redirectType = "main_frame"
|
||||||
browser.storage.local.set({ options })
|
browser.storage.local.set({ options })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const frontend_name_element = document.getElementById(`${service}_page`).getElementsByClassName("frontend_name")[0]
|
const frontend_name_element = document.getElementById(`${service}_page`).getElementsByClassName("frontend_name")[0]
|
||||||
if (divs[service].frontend) {
|
frontend_name_element.href = config.services[service].frontends[divs[service].frontend.value].url
|
||||||
frontend_name_element.href = config.services[service].frontends[divs[service].frontend.value].url
|
|
||||||
} else {
|
|
||||||
frontend_name_element.href = Object.values(config.services[service].frontends)[0].url
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function loadPage(path) {
|
async function loadPage(path) {
|
||||||
|
@ -20,11 +20,8 @@ each val, service in services
|
|||||||
h4
|
h4
|
||||||
a(class="frontend_name" target="_blank" data-localise="__MSG_frontend__") Frontend
|
a(class="frontend_name" target="_blank" data-localise="__MSG_frontend__") Frontend
|
||||||
select(id=service+"-frontend")
|
select(id=service+"-frontend")
|
||||||
if Object.keys(services[service].frontends).length> 1
|
each val, frontend in services[service].frontends
|
||||||
each val, frontend in services[service].frontends
|
option(value=frontend)=services[service].frontends[frontend].name
|
||||||
option(value=frontend)=services[service].frontends[frontend].name
|
|
||||||
else
|
|
||||||
option(value=frontend)=Object.values(services[service].frontends)[0].name
|
|
||||||
|
|
||||||
div(class="some-block option-block" id=service+"-instance-div")
|
div(class="some-block option-block" id=service+"-instance-div")
|
||||||
h4() Instance
|
h4() Instance
|
||||||
@ -47,11 +44,11 @@ each val, service in services
|
|||||||
div(class="some-block option-block")
|
div(class="some-block option-block")
|
||||||
h4 Set LibRedirect as Default Search Engine
|
h4 Set LibRedirect as Default Search Engine
|
||||||
|
|
||||||
hr
|
|
||||||
|
|
||||||
each val, frontend in services[service].frontends
|
each val, frontend in services[service].frontends
|
||||||
if services[service].frontends[frontend].instanceList
|
if services[service].frontends[frontend].instanceList
|
||||||
div(id=frontend dir="ltr")
|
div(id=frontend dir="ltr")
|
||||||
|
hr
|
||||||
div(dir="auto" class="some-block option-block")
|
div(dir="auto" class="some-block option-block")
|
||||||
h4(data-localise="__MSG_addYourFavoriteInstances__") Add your favorite instances
|
h4(data-localise="__MSG_addYourFavoriteInstances__") Add your favorite instances
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user