Refactor and clean up website code

- Refactor layouts and includes
- Abstract out repetitive code
- Clean up source formatting
- Improve fullpage doc handling
- Add comments
- Improve naming consistency
- Remove deprecated files
- Update architecture
- Update doc index
- Miscellaneous improvements
pull/176/head
Andrew David Wong 1 year ago
parent 9c345f6ff2
commit 72f41a0deb
No known key found for this signature in database
GPG Key ID: 8CE137352A019A17
  1. 2
      404.md
  2. 3
      _data/architecture.yml
  3. 6
      _data/doc-index.yml
  4. 259
      _data/downloads-mirrors.yml
  5. 12
      _data/downloads-page.yml
  6. 87
      _includes/admin-api-table.md
  7. 13
      _includes/doc-alert-advanced.html
  8. 13
      _includes/doc-alert-external.html
  9. 12
      _includes/doc-alert-translated.html
  10. 112
      _includes/doc-content.html
  11. 55
      _includes/doc-heading.html
  12. 78
      _includes/doc-index.html
  13. 7
      _includes/doc-sidebar-end.html
  14. 18
      _includes/doc-sidebar-start.html
  15. 10
      _includes/doc-widget.html
  16. 541
      _includes/downloads.html
  17. 24
      _includes/experts.html
  18. 259
      _includes/footer.html
  19. 4
      _includes/hcl-cell.html
  20. 8
      _includes/hcl-color.css
  21. 2
      _includes/hcl-device.html
  22. 94
      _includes/hcl-item.html
  23. 153
      _includes/hcl.html
  24. 74
      _includes/head.html
  25. 74
      _includes/header.html
  26. 25
      _includes/heading.html
  27. 35
      _includes/home-news.html
  28. 13
      _includes/home-research.html
  29. 63
      _includes/news-categories.html
  30. 18
      _includes/news-heading.html
  31. 29
      _includes/news-post-author.html
  32. 9
      _includes/news-post-category.html
  33. 34
      _includes/news-widget.html
  34. 100
      _includes/news.html
  35. 15
      _includes/research.html
  36. 35
      _includes/sec-canary.html
  37. 35
      _includes/sec-qsb.html
  38. 98
      _includes/sec-xsa.html
  39. 160
      _includes/style-guide.html
  40. 35
      _includes/team-heading.html
  41. 23
      _includes/team-simple.html
  42. 169
      _includes/team.html
  43. 9
      _layouts/base.html
  44. 42
      _layouts/default.html
  45. 22
      _layouts/doc-full.html
  46. 117
      _layouts/doc-index.html
  47. 16
      _layouts/doc.html
  48. 36
      _layouts/downloads.html
  49. 1
      _layouts/full.html
  50. 12
      _layouts/fullscreen.html
  51. 43
      _layouts/hcl.html
  52. 9
      _layouts/news.html
  53. 56
      _layouts/post.html
  54. 9
      _layouts/site.html
  55. 44
      _layouts/team.html
  56. 4
      js/jquery.tubeplayer.min.js
  57. 2
      pages/donate.md
  58. 4
      pages/downloads.md
  59. 10
      pages/hcl.md
  60. 39
      pages/home.html
  61. 4
      pages/partners.html
  62. 17
      pages/research.md
  63. 1
      pages/team.md
  64. 2
      pages/terms.md
  65. 2
      pages/website-privacy-policy.md

@ -1,6 +1,6 @@
---
lang: en
layout: default
layout: site
permalink: /404.html
ref: 1
title: 404 Not Found

@ -38,6 +38,7 @@
url: /doc/certified-hardware/
- title: Compatibility List
url: /hcl/
icon: fa-power-off
- title: Installation Guide
url: /doc/installation-guide/
- title: Verifying Signatures
@ -132,8 +133,6 @@
- title: Partners
url: /partners/
icon: fa-globe
- title: Merchandise
url: /merchandise/
- title: Contributing
url: /doc/contributing/

@ -18,8 +18,8 @@
sub-pages:
- url: /security/
- url: /security/pack/
- url: /security/bulletins/
- url: /security/canaries/
- url: /security/qsb/
- url: /security/canary/
- url: /security/xsa/
- url: /security/verifying-signatures/
- url: /security/pgp-keys/
@ -167,7 +167,6 @@
- url: /doc/security-critical-code/
- url: /doc/qubes-core-admin/
- url: /doc/qubes-core-admin-client/
- url: /doc/qubes-admin-api/
- url: /doc/qubes-core-stack/
- url: /doc/gui/
- url: /doc/networking/
@ -185,6 +184,7 @@
- url: /doc/qrexec/
- url: /doc/qrexec-internals/
- url: /doc/qrexec-socket-services/
- url: /doc/admin-api/
- title: Debugging
subcategory: debugging

@ -1,130 +1,129 @@
- organization: Foundation for Applied Privacy
org_url: https://applied-privacy.net/
location: Austria
urls:
- url: https://qubesos-mirror.applied-privacy.net/
- organization: eScience Center, Nanjing University
org_url: https://sci.nju.edu.cn/
location: China
urls:
- url: https://mirrors.nju.edu.cn/qubes/
- url: rsync://mirrors.nju.edu.cn/qubes/
- organization: Tsinghua University TUNA Association
org_url: https://tuna.moe/
location: China
urls:
- url: https://mirrors.tuna.tsinghua.edu.cn/qubesos/
- organization: University of Cyprus, Library
org_url: http://library.ucy.ac.cy
location: Cyprus
urls:
- url: https://mirror.library.ucy.ac.cy/linux/qubes/
- organization: dotsrc.org
org_url: https://dotsrc.org/
location: Denmark
urls:
- url: https://mirrors.dotsrc.org/qubes/
- organization: Hosthink
org_url: https://www.hosthink.net/
location: Finland
urls:
- url: https://mirror-2.hosthink.net/qubes
- organization: Linux Users' Group of Durgapur
org_url: https://dgplug.org/
location: India
urls:
- url: https://mirrors.dgplug.org/qubes/
- organization: RWTH Aachen University
org_url: https://www.halifax.rwth-aachen.de
location: Germany
urls:
- url: http://ftp.halifax.rwth-aachen.de/qubes/iso/
- organization: Kolja Sagorski
org_url: https://koljasagorski.de/
location: Germany
urls:
- url: https://mirror.koljasagorski.de/qubes/
- organization: University of Crete Computer Center
org_url: http://cc.uoc.gr/
location: Greece
urls:
- url: https://ftp.cc.uoc.gr/mirrors/linux/qubes/
- organization: Quantum Mirror
org_url: https://quantum-mirror.hu/
location: Hungary
urls:
- url: https://quantum-mirror.hu/mirrors/pub/qubes
- organization: ICM, University of Warsaw
org_url: http://icm.edu.pl
location: Poland
urls:
- url: http://ftp.icm.edu.pl/pub/os/qubes/
- organization: krmir NPO
org_url: https://krmir.org/
location: South Korea
urls:
- url: https://mirror.krmir.org/qubes
- url: ftp://mirror.krmir.org/qubes
- url: rsync://mirror.krmir.org/qubes
- organization: ACC, Umeå University
org_url: http://www.acc.umu.se/
location: Sweden
urls:
- url: https://ftp.acc.umu.se/mirror/qubes-os.org/
- organization: UKFast
org_url: https://www.ukfast.co.uk/
location: United Kingdom
urls:
- url: https://mirrors.ukfast.co.uk/sites/qubes-os.org/
- organization: GigeNET
org_url: https://www.gigenet.com/
location: United States
urls:
- url: https://mirrors.gigenet.com/qubes/
- organization: Hacking & Coffee
org_url: https://hackingand.coffee/
location: United States
urls:
- url: https://mirror.hackingand.coffee/qubes/
- organization: Internet Archive
org_url: https://archive.org/
location: United States
urls:
- url: https://archive.org/download/QubesOS
- organization: Purdue Linux Users Group
org_url: https://plug-mirror.rcac.purdue.edu/info.html
location: United States
urls:
- url: https://plug-mirror.rcac.purdue.edu/qubes/
- organization: The Linux Kernel Archives
org_url: https://www.kernel.org/
location: (Distributed)
urls:
- url: https://mirrors.edge.kernel.org/qubes/iso/
- organization: The Qubes OS Project
org_url: https://www.qubes-os.org/
location: (Distributed)
urls:
- url: https://ftp.qubes-os.org/iso/
- url: http://iso.qubesosfasa4zl44o4tws22di6kepyzfeqv3tg4e3ztknltfxqrymdad.onion
- organization: Foundation for Applied Privacy
org_url: https://applied-privacy.net/
location: Austria
urls:
- url: https://qubesos-mirror.applied-privacy.net/
- organization: eScience Center, Nanjing University
org_url: https://sci.nju.edu.cn/
location: China
urls:
- url: https://mirrors.nju.edu.cn/qubes/
- url: rsync://mirrors.nju.edu.cn/qubes/
- organization: Tsinghua University TUNA Association
org_url: https://tuna.moe/
location: China
urls:
- url: https://mirrors.tuna.tsinghua.edu.cn/qubesos/
- organization: University of Cyprus, Library
org_url: http://library.ucy.ac.cy
location: Cyprus
urls:
- url: https://mirror.library.ucy.ac.cy/linux/qubes/
- organization: dotsrc.org
org_url: https://dotsrc.org/
location: Denmark
urls:
- url: https://mirrors.dotsrc.org/qubes/
- organization: Hosthink
org_url: https://www.hosthink.net/
location: Finland
urls:
- url: https://mirror-2.hosthink.net/qubes
- organization: Linux Users' Group of Durgapur
org_url: https://dgplug.org/
location: India
urls:
- url: https://mirrors.dgplug.org/qubes/
- organization: RWTH Aachen University
org_url: https://www.halifax.rwth-aachen.de
location: Germany
urls:
- url: http://ftp.halifax.rwth-aachen.de/qubes/iso/
- organization: Kolja Sagorski
org_url: https://koljasagorski.de/
location: Germany
urls:
- url: https://mirror.koljasagorski.de/qubes/
- organization: University of Crete Computer Center
org_url: http://cc.uoc.gr/
location: Greece
urls:
- url: https://ftp.cc.uoc.gr/mirrors/linux/qubes/
- organization: Quantum Mirror
org_url: https://quantum-mirror.hu/
location: Hungary
urls:
- url: https://quantum-mirror.hu/mirrors/pub/qubes
- organization: ICM, University of Warsaw
org_url: http://icm.edu.pl
location: Poland
urls:
- url: http://ftp.icm.edu.pl/pub/os/qubes/
- organization: krmir NPO
org_url: https://krmir.org/
location: South Korea
urls:
- url: https://mirror.krmir.org/qubes
- url: ftp://mirror.krmir.org/qubes
- url: rsync://mirror.krmir.org/qubes
- organization: ACC, Umeå University
org_url: http://www.acc.umu.se/
location: Sweden
urls:
- url: https://ftp.acc.umu.se/mirror/qubes-os.org/
- organization: UKFast
org_url: https://www.ukfast.co.uk/
location: United Kingdom
urls:
- url: https://mirrors.ukfast.co.uk/sites/qubes-os.org/
- organization: GigeNET
org_url: https://www.gigenet.com/
location: United States
urls:
- url: https://mirrors.gigenet.com/qubes/
- organization: Hacking & Coffee
org_url: https://hackingand.coffee/
location: United States
urls:
- url: https://mirror.hackingand.coffee/qubes/
- organization: Internet Archive
org_url: https://archive.org/
location: United States
urls:
- url: https://archive.org/download/QubesOS
- organization: Purdue Linux Users Group
org_url: https://plug-mirror.rcac.purdue.edu/info.html
location: United States
urls:
- url: https://plug-mirror.rcac.purdue.edu/qubes/
- organization: The Linux Kernel Archives
org_url: https://www.kernel.org/
location: (Distributed)
urls:
- url: https://mirrors.edge.kernel.org/qubes/iso/
- organization: The Qubes OS Project
org_url: https://www.qubes-os.org/
location: (Distributed)
urls:
- url: https://ftp.qubes-os.org/iso/
- url: http://iso.qubesosfasa4zl44o4tws22di6kepyzfeqv3tg4e3ztknltfxqrymdad.onion

@ -105,22 +105,16 @@
snippets:
- snippet: This is a testing release.
url: /doc/testing/
- snippet: Please help us improve it by reporting any bugs you encounter.
url: /doc/issue-tracking/
- snippet: For important work, we recommend the latest stable release.
- snippet: Please help us improve it by reporting any bugs you encounter. For important work, we recommend the latest stable release.
- r_version: stable
snippets:
- snippet: This is the latest stable Qubes OS release. We recommend this release for all new and existing users.
- r_version: old
snippets:
- snippet: This is an old, supported release.
url: /doc/supported-versions/
- snippet: For the best Qubes OS experience, we suggest upgrading to the latest stable release.
- snippet: This is an old, supported release. For the best Qubes OS experience, we suggest upgrading to the latest stable release.
- r_version: deprecated
snippets:
- snippet: This is an old, unsupported release.
url: /doc/supported-versions/
- snippet: We strongly recommend upgrading to a supported release in order to receive the latest security updates.
- snippet: This is an old, unsupported release. We strongly recommend upgrading to a supported release in order to receive the latest security updates.
- htmlsection: download-content
links:

@ -0,0 +1,87 @@
| call | dest | argument | inside | return | note |
| ------------------------------------- | --------- | --------- | ----------------------------------------- | --------------------------------------------------------- | ---- |
| `admin.vmclass.List` | `dom0` | - | - | `<class>\n` |
| `admin.vm.List` | `dom0|<vm>` | - | - | `<name> class=<class> state=<state>\n` |
| `admin.vm.Create.<class>` | `dom0` | template | `name=<name> label=<label>` | - |
| `admin.vm.CreateInPool.<class>` | `dom0` | template | `name=<name> label=<label> `<br/>`pool=<pool> pool:<volume>=<pool>` | - | either use `pool=` to put all volumes there, <br/>or `pool:<volume>=` for individual volumes - both forms are not allowed at the same time
| `admin.vm.CreateDisposable` | template | - | - | name | Create new DisposableVM, `template` is any AppVM with `dispvm_allowed` set to True, or `dom0` to use default defined in `default_dispvm` property of calling VM; VM created with this call will be automatically removed after its shutdown; the main difference from `admin.vm.Create.DispVM` is automatic (random) name generation.
| `admin.vm.Remove` | vm | - | - | - |
| `admin.label.List` | `dom0` | - | - | `<property>\n` |
| `admin.label.Create` | `dom0` | label | `0xRRGGBB` | - |
| `admin.label.Get` | `dom0` | label | - | `0xRRGGBB` |
| `admin.label.Index` | `dom0` | label | - | `<label-index>` |
| `admin.label.Remove` | `dom0` | label | - | - |
| `admin.property.List` | `dom0` | - | - | `<property>\n` |
| `admin.property.Get` | `dom0` | property | - | `default={True|False} `<br/>`type={str|int|bool|vm|label|list} <value>` | Type `list` is added in R4.1. Values are of type `str` and each entry is suffixed with newline character.
| `admin.property.GetAll` | `dom0` | - | - | `<property-name> <full-value-as-in-property.Get>\n` | Get all the properties in one call. Each property is returned on a separate line and use the same value encoding as property.Get method, with an exception that newlines are encoded as literal `\n` and literal `\` are encoded as `\\`.
| `admin.property.GetDefault` | `dom0` | property | - | `type={str|int|bool|vm|label|list} <value>` | Type `list` is added in R4.1. Values are of type `str` and each entry is suffixed with newline character.
| `admin.property.Help` | `dom0` | property | - | `help` |
| `admin.property.HelpRst` | `dom0` | property | - | `help.rst` |
| `admin.property.Reset` | `dom0` | property | - | - |
| `admin.property.Set` | `dom0` | property | value | - |
| `admin.vm.property.List` | vm | - | - | `<property>\n` |
| `admin.vm.property.Get` | vm | property | - | `default={True|False} `<br/>`type={str|int|bool|vm|label|list} <value>` | Type `list` is added in R4.1. Each list entry is suffixed with a newline character.
| `admin.vm.property.GetAll` | vm | - | - | `<property-name> <full-value-as-in-property.Get>\n` | Get all the properties in one call. Each property is returned on a separate line and use the same value encoding as property.Get method, with an exception that newlines are encoded as literal `\n` and literal `\` are encoded as `\\`.
| `admin.vm.property.GetDefault` | vm | property | - | `type={str|int|bool|vm|label|type} <value>` | Type `list` is added in R4.1. Each list entry is suffixed with a newline character.
| `admin.vm.property.Help` | vm | property | - | `help` |
| `admin.vm.property.HelpRst` | vm | property | - | `help.rst` |
| `admin.vm.property.Reset` | vm | property | - | - |
| `admin.vm.property.Set` | vm | property | value | - |
| `admin.vm.feature.List` | vm | - | - | `<feature>\n` |
| `admin.vm.feature.Get` | vm | feature | - | value |
| `admin.vm.feature.CheckWithTemplate` | vm | feature | - | value |
| `admin.vm.feature.CheckWithNetvm` | vm | feature | - | value |
| `admin.vm.feature.CheckWithAdminVM` | vm | feature | - | value |
| `admin.vm.feature.CheckWithTemplateAndAdminVM`| vm | feature | - | value |
| `admin.vm.feature.Remove` | vm | feature | - | - |
| `admin.vm.feature.Set` | vm | feature | value | - |
| `admin.vm.tag.List` | vm | - | - | `<tag>\n` |
| `admin.vm.tag.Get` | vm | tag | - | `0` or `1` | retcode? |
| `admin.vm.tag.Remove` | vm | tag | - | - |
| `admin.vm.tag.Set` | vm | tag | - | - |
| `admin.vm.firewall.Get` | vm | - | - | `<rule>\n` | rules syntax as in [firewall interface](/doc/vm-interface/#firewall-rules-in-4x) with addition of `expire=` and `comment=` options; `comment=` (if present) must be the last option
| `admin.vm.firewall.Set` | vm | - | `<rule>\n` | - | set firewall rules, see `admin.vm.firewall.Get` for syntax
| `admin.vm.firewall.Reload` | vm | - | - | - | force reload firewall without changing any rule
| `admin.vm.device.<class>.Attach` | vm | device | options | - | `device` is in form `<backend-name>+<device-ident>` <br/>optional options given in `key=value` format, separated with spaces; <br/>options can include `persistent=True` to "persistently" attach the device (default is temporary)
| `admin.vm.device.<class>.Detach` | vm | device | - | - | `device` is in form `<backend-name>+<device-ident>`
| `admin.vm.device.<class>.Set.persistent`| vm | device | `True`\|`False` | - | `device` is in form `<backend-name>+<device-ident>`
| `admin.vm.device.<class>.List` | vm | - | - | `<device> <options>\n` | options can include `persistent=True` for "persistently" attached devices (default is temporary)
| `admin.vm.device.<class>.Available` | vm | device-ident | - | `<device-ident> <properties> description=<desc>\n` | optional service argument may be used to get info about a single device, <br/>optional (device class specific) properties are in `key=value` form, <br/>`description` must be the last one and is the only one allowed to contain spaces
| `admin.pool.List` | `dom0` | - | - | `<pool>\n` |
| `admin.pool.ListDrivers` | `dom0` | - | - | `<pool-driver> <property> ...\n` | Properties allowed in `admin.pool.Add`
| `admin.pool.Info` | `dom0` | pool | - | `<property>=<value>\n` |
| `admin.pool.Add` | `dom0` | driver | `<property>=<value>\n` | - |
| `admin.pool.Set.revisions_to_keep` | `dom0` | pool | `<value>` | - |
| `admin.pool.Remove` | `dom0` | pool | - | - |
| `admin.pool.volume.List` | `dom0` | pool | - | volume id |
| `admin.pool.volume.Info` | `dom0` | pool | vid | `<property>=<value>\n` |
| `admin.pool.volume.Set.revisions_to_keep`| `dom0` | pool | `<vid> <value>` | - |
| `admin.pool.volume.ListSnapshots` | `dom0` | pool | vid | `<snapshot>\n` |
| `admin.pool.volume.Snapshot` | `dom0` | pool | vid | snapshot |
| `admin.pool.volume.Revert` | `dom0` | pool | `<vid> <snapshot>` | - |
| `admin.pool.volume.Resize` | `dom0` | pool | `<vid> <size_in_bytes>` | - |
| `admin.pool.volume.Import` | `dom0` | pool | `<vid>\n<raw volume data>` | - |
| `admin.pool.volume.CloneFrom` | `dom0` | pool | vid | token, to be used in `admin.pool.volume.CloneTo` | obtain a token to copy volume `vid` in `pool`;<br/>the token is one time use only, it's invalidated by `admin.pool.volume.CloneTo`, even if the operation fails |
| `admin.pool.volume.CloneTo` | `dom0` | pool | `<vid> <token>` | - | copy volume pointed by a token to volume `vid` in `pool` |
| `admin.vm.volume.List` | vm | - | - | `<volume>\n` | `<volume>` is per-VM volume name (`root`, `private`, etc), `<vid>` is pool-unique volume id
| `admin.vm.volume.Info` | vm | volume | - | `<property>=<value>\n` |
| `admin.vm.volume.Set.revisions_to_keep`| vm | volume | value | - |
| `admin.vm.volume.ListSnapshots` | vm | volume | - | snapshot | duplicate of `admin.pool.volume.`, but with other call params |
| `admin.vm.volume.Snapshot` | vm | volume | - | snapshot | id. |
| `admin.vm.volume.Revert` | vm | volume | snapshot | - | id. |
| `admin.vm.volume.Resize` | vm | volume | size_in_bytes | - | id. |
| `admin.vm.volume.Import` | vm | volume | raw volume data | - | id. |
| `admin.vm.volume.ImportWithSize` | vm | volume | `<size_in_bytes>\n<raw volume data>` | - | new version of `admin.vm.volume.Import`, allows new volume to be different size |
| `admin.vm.volume.Clear` | vm | volume | - | - | clear contents of volume |
| `admin.vm.volume.CloneFrom` | vm | volume | - | token, to be used in `admin.vm.volume.CloneTo` | obtain a token to copy `volume` of `vm`;<br/>the token is one time use only, it's invalidated by `admin.vm.volume.CloneTo`, even if the operation fails |
| `admin.vm.volume.CloneTo` | vm | volume | token, obtained with `admin.vm.volume.CloneFrom` | - | copy volume pointed by a token to `volume` of `vm` |
| `admin.vm.Start` | vm | - | - | - |
| `admin.vm.Shutdown` | vm | - | - | - |
| `admin.vm.Pause` | vm | - | - | - |
| `admin.vm.Unpause` | vm | - | - | - |
| `admin.vm.Kill` | vm | - | - | - |
| `admin.backup.Execute` | `dom0` | config id | - | - | config in `/etc/qubes/backup/<id>.conf`, only one backup operation of given `config id` can be running at once |
| `admin.backup.Info` | `dom0` | config id | - | backup info | info what would be included in the backup
| `admin.backup.Cancel` | `dom0` | config id | - | - | cancel running backup operation
| `admin.Events` | `dom0|vm` | - | - | events |
| `admin.vm.Stats` | `dom0|vm` | - | - | `vm-stats` events, see below | emit VM statistics (CPU, memory usage) in form of events

@ -1,15 +1,12 @@
{% if page.lang == nil or page.lang == "en" %}
{% assign msgs = site.data.includes %}
{% assign msgs = site.data.includes %}
{% else %}
{% assign msgs = site.data.translation[page.lang].includes %}
{% if msgs == nil or msgs.size == 0 %}
{% assign msgs = site.data.includes %}
{% endif %}
{% assign msgs = site.data.translation[page.lang].includes %}
{% if msgs == nil or msgs.size == 0 %}
{% assign msgs = site.data.includes %}
{% endif %}
{% endif %}
{% assign advanced = msgs | where_exp: "item", "item.section == 'doc-advanced'" | first %}
<div class="alert alert-sticky alert-warning" role="alert">
<i class="fa fa-exclamation-circle"></i>
<strong>{{ advanced.prompt }}</strong> {{ advanced.text }}

@ -1,15 +1,12 @@
{% if page.lang == nil or page.lang == "en" %}
{% assign msgs = site.data.includes %}
{% assign msgs = site.data.includes %}
{% else %}
{% assign msgs = site.data.translation[page.lang].includes %}
{% if msgs == nil or msgs.size == 0 %}
{% assign msgs = site.data.includes %}
{% endif %}
{% assign msgs = site.data.translation[page.lang].includes %}
{% if msgs == nil or msgs.size == 0 %}
{% assign msgs = site.data.includes %}
{% endif %}
{% endif %}
{% assign external = msgs | where_exp: "item", "item.section == 'doc-external'" | first %}
<div class="alert alert-sticky alert-warning" role="alert">
<i class="fa fa-exclamation-circle"></i>
{{ external.text }}

@ -1,14 +1,12 @@
{% if page.lang == nil or page.lang == "en" %}
{% assign msgs = site.data.includes %}
{% assign msgs = site.data.includes %}
{% else %}
{% assign msgs = site.data.translation[page.lang].includes %}
{% if msgs == nil or msgs.size == 0 %}
{% assign msgs = site.data.includes %}
{% endif %}
{% assign msgs = site.data.translation[page.lang].includes %}
{% if msgs == nil or msgs.size == 0 %}
{% assign msgs = site.data.includes %}
{% endif %}
{% endif %}
{% assign translated = msgs | where_exp: "item", "item.section == 'doc-translated'" | first %}
<div class="alert alert-warning" role="alert">
<i class="fa fa-exclamation-circle"></i>
{{ translated.text }}

@ -1,81 +1,39 @@
<div class="more-bottom white-box page-content">
<!-- Localization -->
{% if page.lang == nil or page.lang == "en" %}
{% assign doc_content = site.data.includes %}
{% assign doc_content = site.data.includes %}
{% else %}
{% assign doc_content = site.data.translation[page.lang].includes %}
{% if doc_content == nil or doc_content.size == 0 %}
{% assign doc_content = site.data.includes %}
{% endif %}
{% assign doc_content = site.data.translation[page.lang].includes %}
{% if doc_content == nil or doc_content.size == 0 %}
{% assign doc_content = site.data.includes %}
{% endif %}
{% endif %}
{% assign docs = doc_content | where_exp: "item", "item.section == 'doc-content'" | first %}
<div class="row">
<div class="col-md-3 sidebar">
<div class="page-source-side remove-bottom">
<h3 class="remove-bottom">{{ docs.text }}</h3>
</div>
<a id="toc-button" data-toggle="collapse" href="#page-toc" class="btn btn-primary btn-block" role="button">{{ docs.text }}</a>
<div id="page-toc" class="collapse in"></div>
<div class="page-source-side">
{% include doc-widget.html %}
</div>
</div>
<div class="toc-button-spacer more-bottom"></div>
<div class="col-xs-12 col-md-9 page-content-right">
<article id="doc-content" class="post-content">
{% assign doc_segments = page.relative_path | split: '/' %}
{% if section.category == "external" %}
{% include doc-alert-external.html %}
{% elsif doc_segments contains 'advanced-topics' or page.advanced %}
{% include doc-alert-advanced.html %}
{% endif %}
<h1>{{ page.title }}</h1>
{{ content }}
<!-- Here below the content will be added an _include only in the case the current page has a permalink ending with the specific word -->
{% assign perm_last_part = page.url | split: '/' | last | lstrip %}
{% if perm_last_part == "bulletins" %}
{% include sec-qsb.html %}
{% endif %}
{% if perm_last_part == "canaries" %}
{% include sec-canary.html %}
{% endif %}
{% if perm_last_part == "xsa" %}
{% include sec-xsa.html %}
{% endif %}
{% if perm_last_part == "style-guide" %}
{% include style-guide.html %}
{% endif %}
</article>
<br>
</div>
</div>
<div class="page-source-bottom">
{% include doc-widget.html %}
</div>
</div>
{% include footer.html %}
<script src="/js/jquery.toc.js"></script>
<script>
$(document).ready(function() {
$('#doc-content').toc({
renderIn: '#page-toc',
anchorPrefix: 'tocAnchor-', // the default prefix used for generated TOC elements IDs
showAlways: true, //Show TOC also if only one H1 is present on page, the TOC is never show if no H1s are found on page
saveShowStatus: false, // Save the collapse status using a cookie (see dependecies for further details)
contentsText: 'Contents', // The label text shown for Content, you can localize passing another string
hideText: 'hide', // The label text shown for hide button, you can localize passing another string
showText: 'show' // The label text shown for show button, you can localize passing another string
})
})
</script>
<script src="/js/anchor.min.js"></script>
<script>
anchors.add();
</script>
<!-- Opening HTML for doc content -->
{% include doc-sidebar-start.html %}
<!-- BEGIN CONTENT -->
{% assign doc_segments = page.relative_path | split: '/' %}
{% if section.category == "external" %}
{% include doc-alert-external.html %}
{% elsif doc_segments contains 'advanced-topics' or page.advanced %}
{% include doc-alert-advanced.html %}
{% endif %}
<h1>{{ page.title }}</h1>
{{ content }}
<!-- Check whether the current page's permalink ends in a specific word.
If it does, include content specific to that page. -->
{% assign perm_last_part = page.url | split: '/' | last | lstrip %}
{% if perm_last_part == "qsb" %}
{% include sec-qsb.html %}
{% endif %}
{% if perm_last_part == "canary" %}
{% include sec-canary.html %}
{% endif %}
{% if perm_last_part == "xsa" %}
{% include sec-xsa.html %}
{% endif %}
{% if perm_last_part == "style-guide" %}
{% include style-guide.html %}
{% endif %}
<!-- END CONTENT -->
<!-- Closing HTML for doc content -->
{% include doc-sidebar-end.html %}

@ -1,3 +1,4 @@
<!-- Localization -->
{% assign doc_segments = page.relative_path | split: '/' %}
{% if page.lang == nil or page.lang == "en" %}
{% assign indexed = site.data.doc-index %}
@ -9,40 +10,38 @@
{% assign indexed = site.data.doc-index %}
{% endif %}
{% endif %}
{% assign doc_link = lang | append: "/doc/" %}
{% assign doc_ind = site.doc | concat: site.qubes-translated | where:'permalink', doc_link %}
{% if doc_ind.size == 0 %}
{% assign doc_link = "/doc/" %}
{% assign indexed = site.data.doc-index %}
{% endif %}
<!-- Create heading -->
{% if page.permalink == doc_link %}
{% assign meta = indexed | where_exp: "item", "item.topic != nil" %}
<h1 class="more-top add-left outer-heading">
<a href="{{ doc_link }}" class="heading-link">
<i class="fa fa-book"></i> {{ meta[0].metatopic }}</a>
</h1>
{% assign meta = indexed | where_exp: "item", "item.topic != nil" %}
<h1 class="more-top add-left outer-heading">
<a href="{{ doc_link }}" class="heading-link">
<i class="fa fa-book"></i> {{ meta[0].metatopic }}</a>
</h1>
{% else %}
{% assign ind = indexed | where_exp: "item", "item.topic == nil" %}
{% for section in ind %}
{% if doc_segments contains section.category %}
<h1 class="more-top add-left outer-heading">
<a href="{{ doc_link }}#{{ section.title | slugify }}" class="heading-link">
<i class="fa fa-book"></i>{{ section.title }}
</a>
{% for subsection in section.sub-pages %}
{% if doc_segments contains subsection.subcategory %}
/
<a href="{{ doc_link }}#{{ subsection.title | slugify }}" class="heading-link">
{{ subsection.title }}
</a>
{% endif %}
{% endfor %}
</h1>
{% endif %}
{% endfor %}
{% assign ind = indexed | where_exp: "item", "item.topic == nil" %}
{% for section in ind %}
<!-- Section heading -->
{% if doc_segments contains section.category %}
<h1 class="more-top add-left outer-heading">
<a href="{{ doc_link }}#{{ section.title | slugify }}" class="heading-link">
<i class="fa fa-book"></i>{{ section.title }}
</a>
<!-- Breadcrumb heading -->
{% for subsection in section.sub-pages %}
{% if doc_segments contains subsection.subcategory %}
/
<a href="{{ doc_link }}#{{ subsection.title | slugify }}" class="heading-link">
{{ subsection.title }}
</a>
{% endif %}
{% endfor %}
</h1>
{% endif %}
{% endfor %}
{% endif %}

@ -0,0 +1,78 @@
<!-- Localization -->
{% if page.lang == nil or page.lang == "en" %}
{% assign doc_content = site.data.includes %}
{% assign lang = "" %}
{% assign indexed = site.data.doc-index %}
{% else %}
{% assign lang = "/" | append: page.lang %}
{% assign doc_content = site.data.translation[page.lang].includes %}
{% if doc_content == nil or doc_content.size == 0 %}
{% assign doc_content = site.data.includes %}
{% endif %}
{% assign indexed = site.data.translation[page.lang].doc-index %}
{% if indexed == nil or indexed.size == 0 %}
{% assign indexed = site.data.doc-index %}
{% endif %}
{% endif %}
{% assign docs = doc_content | where_exp: "item", "item.section == 'doc-content'" | first %}
<!-- Opening HTML for doc content -->
{% include doc-sidebar-start.html %}
<!-- BEGIN CONTENT-->
{% assign ind = indexed | where_exp: "item", "item.topic == nil" %}
<!-- This is needed to assure building the correct ID of the link when there is a translation -->
{% assign index_english = site.data.doc-index | where_exp: "item", "item.topic == nil" %}
{% assign topic = indexed | where_exp: "item", "item.topic != nil" | first %}
<h1 id="qubes-os-documentation">{{ topic.topic }}</h1>
<p> {{ topic.subtopic }}</p>
{% assign english_count = 0 %}
{% for item in ind %}
{% assign item_en = index_english[english_count] %}
{% assign english_count = english_count | plus: 1 %}
<a id="{{ item_en.title | downcase | replace: " ", "-" | replace: ",", ""}}"></a>
<h2 id="{{ item.title | downcase | replace: " ", "-" | replace: ",",""}}">{{ item.title }}</h2>
{% if item.subtitle %}
<p>{{ item.subtitle }}</p>
{% endif %}
{% assign subpages = item.sub-pages | where_exp: "item", "item.title == nil" %}
{% assign subpages2 = item.sub-pages | where_exp: "item", "item.title != nil" %}
{% assign subsubpages_en = item_en.sub-pages | where_exp: "item", "item.title != nil" %}
<ul>
{% for sub in subpages %}{% for page in site.doc %}{% if page.url == sub.url %}
<li><a href="{{ sub.url }}">{{ page.title }}</a></li>
{% endif %}{% endfor %}{% endfor %}
{% for sub in subpages %}{% if item.category == 'external' %}
<li><a href="{{ sub.url }}">{{ sub.text }}</a></li>
{% endif %}{% endfor %}
{% assign sub_count = 0 %}
{% for sub2 in subpages2 %}
{% assign sub_o2 = subsubpages_en[sub_count] %}
{% assign sub_count = sub_count | plus: 1 %}
{% if sub2.url == nil %}
<a id="{{ sub_o2.title | downcase | replace: " ", "-" | replace: ",", "" }}"></a>
<h3 id="{{ sub2.title | downcase | replace: " ", "-" | replace: ",","" }}">{{ sub2.title }}</h3>
{% else %}
<ul>
<li><a href="{{ sub2.url }}">{{ sub2.title }}</a></li>
</ul>
{% endif %}
{% assign subpages3 = sub2.sub-pages %}
<ul>
{% for sub3 in subpages3 %}
{% for page in site.doc %}
{% if page.url == sub3.url %}
<li><a href="{{ sub3.url }}">{{ page.title }}</a></li>
{% endif %}
{% endfor %}
{% endfor %}
{% for sub3 in subpages3 %}
{% if item.category == 'external' %}
<li><a href="{{ sub3.url }}">{{ sub3.text }}</a></li>
{% endif %}
{% endfor %}
</ul>
{% endfor %}
</ul>
{% endfor %}
<!-- END CONTENT-->
<!-- Closing HTML for doc content -->
{% include doc-sidebar-end.html %}

@ -0,0 +1,7 @@
</article>
<br>
</div>
</div>
<div class="page-source-bottom">
{% include doc-widget.html %}
</div>

@ -0,0 +1,18 @@
<div class="row">
{% if page.layout == 'fullscreen' %}
<div class="col-xs-12">
{% else %}
<div class="col-md-3 sidebar">
<div class="page-source-side remove-bottom">
<h3 class="remove-bottom">{{ docs.text }}</h3>
</div>
<a id="toc-button" data-toggle="collapse" href="#page-toc" class="btn btn-primary btn-block" role="button">{{ docs.text }}</a>
<div id="page-toc" class="collapse in"></div>
<div class="page-source-side">
{% include doc-widget.html %}
</div>
</div>
<div class="toc-button-spacer more-bottom"></div>
<div class="col-xs-12 col-md-9 page-content-right">
{% endif %}
<article id="doc-content" class="post-content">

@ -1,3 +1,4 @@
<!-- Localization -->
{% if page.lang == nil or page.lang == "en" %}
{% assign doc_content = site.data.includes %}
{% else %}
@ -6,9 +7,7 @@
{% assign doc_content = site.data.includes %}
{% endif %}
{% endif %}
{% assign docs = doc_content | where_exp: "item", "item.section == 'doc-widget'" | first %}
{% if page.lang == nil or page.lang == "en" %}
{% assign master_edit = site.project_repo_path | append: "/qubes-doc/edit/master" | append: page.relative_path | remove_first: '_doc' %}
{% assign master_blob = site.project_repo_path | append: "/qubes-doc/blob/master" | append: page.relative_path | remove_first: '_doc' %}
@ -16,14 +15,13 @@
{% assign master_edit = site.project_repo_path | append: "/qubes-translated/edit/master" | append: page.relative_path | remove_first: '_qubes-translated' %}
{% assign master_blob = site.project_repo_path | append: "/qubes-translated/blob/master" | append: page.relative_path| remove_first: '_qubes-translated' %}
{% endif %}
<!-- Button links -->
{% for item in docs.links %}
{% if item.icon == "fa-book" %}
{% assign a_class = "btn btn-primary btn-block" %}
{% else %}
{% assign a_class = "page-source-link btn btn-default btn-block" %}
{% endif %}
{% if item.icon == "fa-code" %}
{% assign a_href = master_blob %}
{% elsif item.icon == "fa-code-fork" %}
@ -31,9 +29,7 @@
{% else %}
{% assign a_href = item.url %}
{% endif %}
<a href="{{ a_href }}"
class="{{ a_class }}"
title="{{ item.text }}">
<a href="{{ a_href }}" class="{{ a_class }}" title="{{ item.text }}">
<span class="fa fa-fw {{ item.icon }}"></span> {{ item.text }}
</a><br>
{% endfor %}

@ -1,95 +1,91 @@
<!-- Localization -->
{% if page.lang == nil or page.lang == "en" %}
{% assign down = site.data.downloads-page %}
{% assign lang = "" %}
{% assign down = site.data.downloads-page %}
{% assign lang = "" %}
{% else %}
{% assign lang = "/" | append: page.lang %}
{% assign down = site.data.translation[page.lang].downloads-page %}
{% if down == nil or down.size == 0 %}
{% assign down = site.data.downloads-page %}
{% endif %}
{% assign lang = "/" | append: page.lang %}
{% assign down = site.data.translation[page.lang].downloads-page %}
{% if down == nil or down.size == 0 %}
{% assign down = site.data.downloads-page %}
{% endif %}
{% endif %}
{% assign hw = down | where_exp: "item", "item.htmlsection == 'hardware'" | first %}
{% assign sr = hw.links | where_exp: "item", "item.id == 1" | first %}
{% assign ch = hw.links | where_exp: "item", "item.id == 2" | first %}
{% assign hcl = hw.links | where_exp: "item", "item.id == 3" | first %}
{% assign sec = down | where_exp: "item", "item.htmlsection == 'sec'" | first %}
{% assign ig = sec.links | where_exp: "item", "item.id == 1" | first %}
{% assign vs = sec.links | where_exp: "item", "item.id == 2" | first %}
{% assign isc = sec.links | where_exp: "item", "item.id == 3" | first %}
{% assign help = down | where_exp: "item", "item.htmlsection == 'help'" | first %}
{% assign hs = help.links | where_exp: "item", "item.id == 1" | first %}
{% assign tg = help.links | where_exp: "item", "item.id == 2" | first %}
{% assign rb = help.links | where_exp: "item", "item.id == 3" | first %}
<div class="white-box more-bottom page-content">
<div class="row">
<div class="col-xs-12 col-sm-4">
<h3>{{ hw.title }}</h3>
<ul class="list-unstyled">
<li>
<a href="{{ sr.url }}" class="black-link">
<i class="fa fa-server fa-fw black-icon"></i> {{ sr.text }}
</a>
</li>
<li>
<a href="{{ ch.url }}" class="black-link">
<i class="fa fa-floppy-o fa-fw black-icon"></i> {{ ch.text }}
</a>
</li>
<li>
<a href="{{ hcl.url }}" class="black-link">
<i class="fa fa-laptop fa-fw black-icon"></i> {{ hcl.text }}
</a>
</li>
</ul>
</div>
<div class="col-xs-12 col-sm-4">
<h3> {{ sec.title }}</h3>
<ul class="list-unstyled">
<li>
<a href="{{ ig.url }}" class="black-link">
<i class="fa fa-book fa-fw black-icon"></i> {{ ig.text }}
</a>
</li>
<li>
<a href="{{ vs.url }}" class="black-link">
<i class="fa fa-lock fa-fw black-icon"></i> {{ vs.text }}
</a>
</li>
<li>
<a href="{{ isc.url }}" class="black-link">
<i class="fa fa-lightbulb-o fa-fw black-icon"></i> {{ isc.text }}
</a>
</li>
</ul>
</div>
<div class="col-xs-12 col-sm-4">
<h3>{{ help.title }}</h3>
<ul class="list-unstyled">
<li>
<a href="{{ hs.url }}" class="black-link">
<i class="fa fa-life-ring fa-fw black-icon"></i> {{ hs.text }}
</a>
</li>
<li>
<a href="{{ tg.url }}" class="black-link">
<i class="fa fa-file-text-o fa-fw black-icon"></i> {{ tg.text }}
</a>
</li>
<li>
<a href="{{ rb.url }}" class="black-link">
<i class="fa fa-bug fa-fw black-icon"></i> {{ rb.text }}
</a>
</li>
</ul>
</div>
<!-- Top row helper links -->
<div class="row">
<div class="col-xs-12 col-sm-4">
<h3>{{ hw.title }}</h3>
<ul class="list-unstyled">
<li>
<a href="{{ sr.url }}" class="black-link">
<i class="fa fa-server fa-fw black-icon"></i> {{ sr.text }}
</a>
</li>
<li>
<a href="{{ ch.url }}" class="black-link">
<i class="fa fa-floppy-o fa-fw black-icon"></i> {{ ch.text }}
</a>
</li>
<li>
<a href="{{ hcl.url }}" class="black-link">
<i class="fa fa-laptop fa-fw black-icon"></i> {{ hcl.text }}
</a>
</li>
</ul>
</div>
<div class="col-xs-12 col-sm-4">
<h3> {{ sec.title }}</h3>
<ul class="list-unstyled">
<li>
<a href="{{ ig.url }}" class="black-link">
<i class="fa fa-book fa-fw black-icon"></i> {{ ig.text }}
</a>
</li>
<li>
<a href="{{ vs.url }}" class="black-link">
<i class="fa fa-lock fa-fw black-icon"></i> {{ vs.text }}
</a>
</li>
<li>
<a href="{{ isc.url }}" class="black-link">
<i class="fa fa-lightbulb-o fa-fw black-icon"></i> {{ isc.text }}
</a>
</li>
</ul>
</div>
<div class="col-xs-12 col-sm-4">
<h3>{{ help.title }}</h3>
<ul class="list-unstyled">
<li>
<a href="{{ hs.url }}" class="black-link">
<i class="fa fa-life-ring fa-fw black-icon"></i> {{ hs.text }}
</a>
</li>
<li>
<a href="{{ tg.url }}" class="black-link">
<i class="fa fa-file-text-o fa-fw black-icon"></i> {{ tg.text }}
</a>
</li>
<li>
<a href="{{ rb.url }}" class="black-link">
<i class="fa fa-bug fa-fw black-icon"></i> {{ rb.text }}
</a>
</li>
</ul>
</div>
</div>
<!-- Showcase -->
{% assign surv = down | where_exp: "item", "item.htmlsection == 'survey'" | first %}
<hr class="more-bottom">
<div class="row">
<div class="col-xs-12">
@ -101,19 +97,17 @@
href="https://survey.qubes-os.org/index.php?r=survey/index&sid=791682&lang=en">{{ surv.text }}</a>
</div>
</div>
<hr class="more-bottom">
<!-- Localization -->
{% assign ls = down | where_exp: "item", "item.htmlsection == 'loop-releases'" | first %}
{% assign test = ls.releases | where_exp: "item", "item.r_version == 'testing'" | first %}
{% assign stable = ls.releases | where_exp: "item", "item.r_version == 'stable'" | first %}
{% assign old = ls.releases | where_exp: "item", "item.r_version == 'old'" | first %}
{% assign depr = ls.releases | where_exp: "item", "item.r_version == 'deprecated'" | first %}
<hr class="more-bottom">
<!-- Downloads by release -->
{% for releasex in site.data.downloads.releases %}
<div class="row">
<div class="col-xs-12">
{% assign release_name = releasex[0] %}
{% assign release = releasex[1] %}
{% assign testing = release.testing | default: false %}
@ -121,54 +115,54 @@
{% assign aging = release.aging | default: false %}
{% assign deprecated = release.deprecated | default: false %}
<h3 id="{{ release_name | slugify }}">{{ release_name }}</h3>
<!-- Testing releases -->
{% if testing %}
<div class="alert alert-info" role="alert">
<i class="fa fa-question-circle"></i>
{% if testing != true %}
{{ testing }}
{% else %}
{% for s in test.snippets %}
{% if s.url != nil %}
<a href="{{ s.url }}">{{ s.snippet }}</a>
<div class="alert alert-info" role="alert">
<i class="add-right fa fa-question-circle"></i>
{% if testing != true %}
{{ testing }}
{% else %}
{{ s.snippet }}
{% for s in test.snippets %}
{% if s.url != nil %}
<a href="{{ s.url }}">{{ s.snippet }}</a>
{% else %}
{{ s.snippet }}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
{% endif %}
</div>
</div>
{% endif %}
{% if latest %}
<div class="alert alert-success" role="alert">
<i class="fa fa-check-circle"></i>
{% if latest != true %}
{{ latest }}
{% else %}
{{ stable.snippets[0].snippet }}
{% endif %}
</div>
<div class="alert alert-success" role="alert">
<i class="add-right fa fa-check-circle"></i>
{% if latest != true %}
{{ latest }}
{% else %}
{{ stable.snippets[0].snippet }}
{% endif %}
</div>
{% endif %}
<!-- Aging releases -->
{% if aging %}
<div class="alert alert-warning" role="alert">
<i class="fa fa-info-circle"></i>
{% if aging != true %}
{{ aging }}
{% else %}
{% for s in old.snippets %}
{% if s.url != nil %}
<a href="{{ s.url }}">{{ s.snippet }}</a>
<div class="alert alert-warning" role="alert">
<i class="add-right fa fa-info-circle"></i>
{% if aging != true %}
{{ aging }}
{% else %}
{{ s.snippet }}
{% for s in old.snippets %}
{% if s.url != nil %}
<a href="{{ s.url }}">{{ s.snippet }}</a>
{% else %}
{{ s.snippet }}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
{% endif %}
</div>
</div>
{% endif %}
<!-- Deprecated releases -->
{% if deprecated %}
<div class="alert alert-danger" role="alert">
<i class="fa fa-exclamation-circle"></i>
<i class="add-right fa fa-exclamation-circle"></i>
{% if deprecated != true %}
{{ deprecated }}
{% else %}
@ -182,213 +176,196 @@
{% endif %}
</div>
{% endif %}
</div>
</div>
{% assign code = down | where_exp: "item", "item.htmlsection == 'source-code'" | first %}
{% assign scode = code.links | where_exp: "item", "item.id == 1" | first %}
{% assign cg = code.links | where_exp: "item", "item.id == 2" | first %}
{% assign sl = code.links | where_exp: "item", "item.id == 3" | first %}
{% assign downcont = down | where_exp: "item", "item.htmlsection == 'download-content'" | first %}
<div class="row download-content">
{% for source in release.sources %}
{% if source.display %}
<div class="col-xs-12 col-sm-6 col-lg-4 add-bottom">
<a class="btn btn-primary btn-block" href="{{ source.url }}"
title="{{ release_name }} {{ source.type }}: {{ source.size }}">
<i class="fa fa-fw fa-download"></i>
<samp>{{ source.filename }}</samp>
</a>
{% for verifier in source.verifiers %}
{% if verifier[0] == "hash" %}
<a class="btn btn-default btn-block" href="{{ verifier[1] }}"
title="Cryptographic hash values for {{ release_name }}.
Right-click → Save link as...">
<i class="fa fa-fw fa-download"></i>{{ downcont.links[0].text }}
</a>
{% elsif verifier[0] == "sig" %}
<a class="btn btn-default btn-block" href="{{ verifier[1] }}"
title="Detached PGP signature file for {{ release_name }}
Right-click → Save link as...">
<i class="fa fa-fw fa-download"></i>{{ downcont.links[1].text }}
</a>
{% elsif verifier[0] == "key" %}
<a class="btn btn-default btn-block" href="{{ verifier[1] }}"
title="PGP Release Signing Key for {{ release_name }}
Right-click → Save link as...">
<i class="fa fa-fw fa-download"></i>{{ downcont.links[2].text }}
</a>
{% endif %}
{% endfor %}
</div>
</div>
{% endif %}
{% endfor %}
<div class="col-xs-12 col-sm-6 col-lg-4">
<ul class="list-unstyled">
<li>
<a href="{{ downcont.links[3].url }}" class="black-link">
<i class="fa fa-fw fa-lock black-icon"></i>
{{ downcont.links[3].text }}
</a>
</li>
{% for docdata in release.docs %}
{% assign doc_name = docdata[0] %}
{% assign doc = docdata[1] %}
{% if doc_name == "Installation Guide" %}
<li>
<a href="{{ lang }}{{ doc.url }}" class="black-link" title="Installation Guide">
<i class="fa fa-fw fa-book black-icon"></i> {{ doc_name }}
</a>
</li>
{% endif %}
{% if doc_name == "Release Notes" %}
<li>
<a href="{{ lang }}{{ doc.url }}" class="black-link" title="Release Notes">
<i class="fa fa-fw fa-file-text-o black-icon"></i> {{ doc_name }}
</a>
</li>
{% endif %}
{% if doc_name == "Release Schedule" %}
<li>
<a href="{{ lang }}{{ doc.url }}" class="black-link" title="Release Schedule">
<i class="fa fa-fw fa-calendar black-icon"></i> {{ doc_name }}
</a>
</li>
<!-- Localization -->
{% assign code = down | where_exp: "item", "item.htmlsection == 'source-code'" | first %}
{% assign scode = code.links | where_exp: "item", "item.id == 1" | first %}
{% assign cg = code.links | where_exp: "item", "item.id == 2" | first %}
{% assign sl = code.links | where_exp: "item", "item.id == 3" | first %}
{% assign downcont = down | where_exp: "item", "item.htmlsection == 'download-content'" | first %}
<!-- Verification downloads -->
<div class="row download-content">
{% for source in release.sources %}
{% if source.display %}
<div class="col-xs-12 col-sm-6 col-lg-4 add-bottom">
<a class="btn btn-primary btn-block" href="{{ source.url }}" title="{{ release_name }} {{ source.type }}: {{ source.size }}">
<i class="fa fa-fw fa-download"></i>
<samp>{{ source.filename }}</samp>
</a>
{% for verifier in source.verifiers %}
{% if verifier[0] == "hash" %}
<a class="btn btn-default btn-block" href="{{ verifier[1] }}" title="Cryptographic hash values for {{ release_name }}. Right-click → Save link as...">
<i class="fa fa-fw fa-download"></i>{{ downcont.links[0].text }}
</a>
{% elsif verifier[0] == "sig" %}
<a class="btn btn-default btn-block" href="{{ verifier[1] }}" title="Detached PGP signature file for {{ release_name }} Right-click → Save link as...">
<i class="fa fa-fw fa-download"></i>{{ downcont.links[1].text }}
</a>
{% elsif verifier[0] == "key" %}
<a class="btn btn-default btn-block" href="{{ verifier[1] }}" title="PGP Release Signing Key for {{ release_name }} Right-click → Save link as...">
<i class="fa fa-fw fa-download"></i>{{ downcont.links[2].text }}
</a>
{% endif %}
{% endfor %}
</div>
{% endif %}
{% endfor %}
<li>
<a href="{{ hs.url }}" class="black-link" title="{{ hs.text }}">
<i class="fa fa-fw fa-life-ring black-icon"></i> {{ hs.text }}
</a>
</li>
<li>
<a href="{{ downcont.links[4].url }}" class="black-link"
title="{{ downcont.links[4].hover }}">
<i class="fa fa-fw fa-cloud-download black-icon"></i>
{{ downcont.links[4].text }}
</a>
</li>
<li>
<a href="{{ scode.url }}" class="black-link" title="{{ scode.text }}">
<i class="fa fa-fw fa-code black-icon"></i> {{ scode.text }}
</a>
</li>
</ul>
{% endfor %}
<!-- Download helper links -->
<div class="col-xs-12 col-sm-6 col-lg-4">
<ul class="list-unstyled">
<li>
<a href="{{ downcont.links[3].url }}" class="black-link">
<i class="fa fa-fw fa-lock black-icon"></i> {{ downcont.links[3].text }}
</a>
</li>
{% for docdata in release.docs %}
{% assign doc_name = docdata[0] %}
{% assign doc = docdata[1] %}
{% if doc_name == "Installation Guide" %}
<li>
<a href="{{ lang }}{{ doc.url }}" class="black-link" title="Installation Guide">
<i class="fa fa-fw fa-book black-icon"></i> {{ doc_name }}
</a>
</li>
{% endif %}
{% if doc_name == "Release Notes" %}
<li>
<a href="{{ lang }}{{ doc.url }}" class="black-link" title="Release Notes">
<i class="fa fa-fw fa-file-text-o black-icon"></i> {{ doc_name }}
</a>
</li>
{% endif %}
{% if doc_name == "Release Schedule" %}
<li>
<a href="{{ lang }}{{ doc.url }}" class="black-link" title="Release Schedule">
<i class="fa fa-fw fa-calendar black-icon"></i> {{ doc_name }}
</a>
</li>
{% endif %}
{% endfor %}
<li>
<a href="{{ hs.url }}" class="black-link" title="{{ hs.text }}">
<i class="fa fa-fw fa-life-ring black-icon"></i> {{ hs.text }}
</a>
</li>
<li>
<a href="{{ downcont.links[4].url }}" class="black-link" title="{{ downcont.links[4].hover }}">
<i class="fa fa-fw fa-cloud-download black-icon"></i> {{ downcont.links[4].text }}
</a>
</li>
<li>
<a href="{{ scode.url }}" class="black-link" title="{{ scode.text }}">
<i class="fa fa-fw fa-code black-icon"></i> {{ scode.text }}
</a>
</li>
</ul>
</div>
</div>
</div>
<hr class="more-bottom">
<hr class="more-bottom">
{% endfor %}
<!-- Download mirrors -->
{% assign dm = down | where_exp: "item", "item.htmlsection == 'download-mirrors'" | first %}
<div class="row">
<div class="col-xs-12">
<article>
<article>
<h3 id="mirrors">{{ dm.title }}</h3>
<p>{{ dm.text }}</p>
<table>
<tr>
<th>{{ dm.table[0].column }}</th>
<th>{{ dm.table[1].column }}</th>
<th>{{ dm.table[2].column }}</th>
</tr>
<table>
<tr>
<th>{{ dm.table[0].column }}</th>
<th>{{ dm.table[1].column }}</th>
<th>{{ dm.table[2].column }}</th>
</tr>
{% for mirror in site.data.downloads-mirrors %}
<tr id="{{ mirror.organization | slugify }}">
<td><a href="{{ mirror.org_url }}">{{ mirror.organization }}</a></td>
<td>{{ mirror.location }}</td>
<td>
{{ mirror.location }}
</td>
<td>
{% for url in mirror.urls %}
<a href="{{ url.url }}">{{ url.url | truncate: 76 }}</a><br>
{% endfor %}
{% for url in mirror.urls %}