├── sass
├── forums_dark.scss
├── forums_light.scss
├── _styles_dark.scss
├── _styles_light.scss
├── website_dark.scss
├── website_light.scss
├── documentation_dark.scss
├── documentation_light.scss
├── _base.scss
├── _styles.scss
├── _highlighting_dark.scss
├── _layout_screens.scss
├── _highlighting_light.scss
├── _privacy.scss
├── _scrollpane.scss
├── _theme_dark.scss
├── _theme_light.scss
├── _ads.scss
├── _docs.scss
├── _forum_screens.scss
├── _sidebars.scss
├── _normalize.scss
├── _downloads.scss
├── _layout.scss
├── _reboot.scss
└── _forums.scss
├── images
├── embed_logo.png
├── favicons
│ ├── favicon.ico
│ ├── mstile-70x70.png
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── mstile-144x144.png
│ ├── mstile-150x150.png
│ ├── mstile-310x150.png
│ ├── mstile-310x310.png
│ ├── apple-touch-icon.png
│ ├── android-chrome-192x192.png
│ ├── manifest.json
│ ├── browserconfig.xml
│ └── safari-pinned-tab.svg
├── logo.svg
├── embed_logo.svg
└── logo_docs.svg
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── templates
├── base_page.html
├── project_index.html
├── page_directory_body.html
├── page_footer.html
└── page_header.html
├── requirements.txt
├── .gitignore
├── .gitattributes
├── css
├── tooltipster-shadow.css
└── tooltipster.css
├── settings.gradle
├── Dockerfile
├── Dockerfile-webhook
├── js
├── docs.js
├── theme-switch-toggle.js
├── theme-switch.js
├── files.js
├── curse-ads.js
├── sidebar.js
└── google-ads.js
├── runTestPageGen.sh
├── docker-compose.yml
├── runTestPageGen.bat
├── README.md
├── python
├── templates.py
├── page_generator.py
├── generators.py
├── page_generator_service.py
├── mc_version.py
└── metadata.py
├── gradlew.bat
├── Instructions.md
└── gradlew
/sass/forums_dark.scss:
--------------------------------------------------------------------------------
1 | @import "styles_dark";
2 | @import "sidebars";
3 | @import "forums";
--------------------------------------------------------------------------------
/sass/forums_light.scss:
--------------------------------------------------------------------------------
1 | @import "styles_light";
2 | @import "sidebars";
3 | @import "forums";
--------------------------------------------------------------------------------
/images/embed_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/images/embed_logo.png
--------------------------------------------------------------------------------
/images/favicons/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/images/favicons/favicon.ico
--------------------------------------------------------------------------------
/sass/_styles_dark.scss:
--------------------------------------------------------------------------------
1 | @import "theme_dark";
2 | @import "normalize";
3 | @import "reboot";
4 | @import "styles";
--------------------------------------------------------------------------------
/images/favicons/mstile-70x70.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/images/favicons/mstile-70x70.png
--------------------------------------------------------------------------------
/sass/_styles_light.scss:
--------------------------------------------------------------------------------
1 | @import "theme_light";
2 | @import "normalize";
3 | @import "reboot";
4 | @import "styles";
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/images/favicons/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/images/favicons/favicon-16x16.png
--------------------------------------------------------------------------------
/images/favicons/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/images/favicons/favicon-32x32.png
--------------------------------------------------------------------------------
/images/favicons/mstile-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/images/favicons/mstile-144x144.png
--------------------------------------------------------------------------------
/images/favicons/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/images/favicons/mstile-150x150.png
--------------------------------------------------------------------------------
/images/favicons/mstile-310x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/images/favicons/mstile-310x150.png
--------------------------------------------------------------------------------
/images/favicons/mstile-310x310.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/images/favicons/mstile-310x310.png
--------------------------------------------------------------------------------
/images/favicons/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/images/favicons/apple-touch-icon.png
--------------------------------------------------------------------------------
/templates/base_page.html:
--------------------------------------------------------------------------------
1 | {% include 'page_header.html' %}
2 | {% include 'page_body.html' %}
3 | {% include 'page_footer.html' %}
--------------------------------------------------------------------------------
/images/favicons/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/MinecraftForge/Web/HEAD/images/favicons/android-chrome-192x192.png
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | Jinja2~=3.1.2
2 | Markdown~=3.5
3 | MarkupSafe~=2.0
4 | requests~=2.28.1
5 | flask~=3.0.0
6 | waitress~=2.1.2
7 | paste~=3.6.0
--------------------------------------------------------------------------------
/templates/project_index.html:
--------------------------------------------------------------------------------
1 | {% include 'page_header.html' %}
2 | {% include 'page_directory_body.html' %}
3 | {% include 'page_footer.html' %}
--------------------------------------------------------------------------------
/sass/website_dark.scss:
--------------------------------------------------------------------------------
1 | @import "styles_dark";
2 | @import "sidebars";
3 | @import "downloads";
4 | @import "scrollpane";
5 | @import "privacy";
6 |
--------------------------------------------------------------------------------
/sass/website_light.scss:
--------------------------------------------------------------------------------
1 | @import "styles_light";
2 | @import "sidebars";
3 | @import "downloads";
4 | @import "scrollpane";
5 | @import "privacy";
6 |
--------------------------------------------------------------------------------
/sass/documentation_dark.scss:
--------------------------------------------------------------------------------
1 | $font-size-code: 0.9rem;
2 | @import "styles_dark";
3 | @import "sidebars";
4 | @import "scrollpane";
5 | @import "docs";
6 | @import "highlighting_dark";
--------------------------------------------------------------------------------
/sass/documentation_light.scss:
--------------------------------------------------------------------------------
1 | $font-size-code: 0.9rem;
2 | @import "styles_light";
3 | @import "sidebars";
4 | @import "scrollpane";
5 | @import "docs";
6 | @import "highlighting_light";
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /__pycache__/
2 | /output_web/
3 | *.bat
4 | /cache/
5 | /output_meta/
6 | /.venv/
7 | /.idea/
8 | /build
9 | /.gradle
10 | /tstin/
11 | /tstout/
12 | /out/
13 | /python/__pycache__/
14 | /test.sh
15 | /test/*
16 | !/test/Help.txt
17 | /repo/
18 |
--------------------------------------------------------------------------------
/images/favicons/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Forge",
3 | "icons": [
4 | {
5 | "src": "\/android-chrome-192x192.png",
6 | "sizes": "192x192",
7 | "type": "image\/png"
8 | }
9 | ],
10 | "theme_color": "#ffffff",
11 | "display": "standalone"
12 | }
13 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
4 | networkTimeout=10000
5 | validateDistributionUrl=true
6 | zipStoreBase=GRADLE_USER_HOME
7 | zipStorePath=wrapper/dists
8 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text eol=lf
2 | *.bat text eol=crlf
3 | *.patch text eol=lf
4 | *.java text eol=lf
5 | *.gradle text eol=crlf
6 | *.png binary
7 | *.gif binary
8 | *.exe binary
9 | *.dll binary
10 | *.jar binary
11 | *.lzma binary
12 | *.zip binary
13 | *.pyd binary
14 | *.cfg text eol=lf
15 | *.py text eol=lf
16 | *.jks binary
--------------------------------------------------------------------------------
/css/tooltipster-shadow.css:
--------------------------------------------------------------------------------
1 | .tooltipster-shadow {
2 | border-radius: 5px;
3 | background: #fff;
4 | box-shadow: 0px 0px 14px rgba(0,0,0,0.3);
5 | color: #2c2c2c;
6 | }
7 | .tooltipster-shadow .tooltipster-content {
8 | font-family: 'Arial', sans-serif;
9 | font-size: 14px;
10 | line-height: 16px;
11 | padding: 8px 10px;
12 | }
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | gradlePluginPortal()
4 | maven {
5 | name = 'MinecraftForge'
6 | url = 'https://maven.minecraftforge.net/'
7 | }
8 | }
9 | }
10 |
11 | plugins {
12 | id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0'
13 | }
14 |
15 | rootProject.name = 'web'
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:3.9-alpine
2 |
3 | VOLUME /in
4 | VOLUME /out
5 |
6 | WORKDIR /app
7 |
8 | COPY requirements.txt ./
9 | RUN pip install --no-cache-dir -r requirements.txt
10 |
11 | COPY python python
12 | COPY templates templates
13 |
14 | COPY build/distributions/static-bundle.zip .
15 | RUN unzip static-bundle.zip -d static && rm static-bundle.zip
16 |
17 | ENTRYPOINT [ "python", "-u", "python/page_generator.py" ]
18 |
--------------------------------------------------------------------------------
/Dockerfile-webhook:
--------------------------------------------------------------------------------
1 | FROM python:3.9-alpine
2 |
3 | VOLUME /in
4 | VOLUME /out
5 |
6 | WORKDIR /app
7 |
8 | COPY requirements.txt ./
9 | RUN pip install --no-cache-dir -r requirements.txt
10 |
11 | COPY python python
12 | COPY templates templates
13 |
14 | COPY build/distributions/static-bundle.zip .
15 | RUN unzip static-bundle.zip -d static && rm static-bundle.zip
16 |
17 | ENTRYPOINT [ "python", "-u", "python/page_generator_service.py" ]
18 |
--------------------------------------------------------------------------------
/js/docs.js:
--------------------------------------------------------------------------------
1 | $(document).ready(function () {
2 | window.themeSwitchToggle();
3 |
4 | $('pre.highlight code[class*=\'language-\']').each(function () {
5 | var className = this.className.match(/language-([A-Za-z0-9+-]+)/);
6 | if (className) {
7 | $(this).removeClass(className[0]);
8 | $(this).addClass(className[1].toLowerCase());
9 | }
10 | });
11 | hljs.initHighlighting();
12 | });
13 |
--------------------------------------------------------------------------------
/images/favicons/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | #ff0000
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/sass/_base.scss:
--------------------------------------------------------------------------------
1 | $font-family-base: 'Source Sans Pro', sans-serif !default;
2 | $font-size-root: 14px !default;
3 | $font-size-base: 1rem !default;
4 | $line-height-base: 1.4 !default;
5 | $font-size-code: 0.8rem !default;
6 |
7 | $table-bg: transparent !default;
8 | $table-cell-padding: .75rem !default;
9 |
10 | $abbr-border-color: #818a91 !default;
11 | $dt-font-weight: bold !default;
12 | $cursor-disabled: not-allowed !default;
13 |
14 | $mobile-break: 1020px;
--------------------------------------------------------------------------------
/sass/_styles.scss:
--------------------------------------------------------------------------------
1 | /*
2 | Generic stylesheet shared across all platforms
3 | */
4 | @import "base";
5 | @import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300);
6 | @import url('https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400,700&subset=latin-ext');
7 |
8 | @import "layout";
9 | // All sites may contain ads
10 | @import "ads";
11 |
12 | .clearfix {
13 | &:after {
14 | content: ".";
15 | clear: both;
16 | display: block;
17 | visibility: hidden;
18 | height: 0;
19 | }
20 | }
--------------------------------------------------------------------------------
/js/theme-switch-toggle.js:
--------------------------------------------------------------------------------
1 | /*
2 | Enables switching themes on the fly.
3 | Initialize by calling window.themeSwitchToggle() from $(document).ready
4 | */
5 |
6 | window.themeSwitchToggle = function () {
7 | var toggle = $('.theme-switch input');
8 | toggle.prop('checked', localStorage.theme === window.forge.THEME_DARK);
9 | toggle.change(function () {
10 | localStorage.theme = $(this).is(':checked') ? window.forge.THEME_DARK : window.forge.THEME_LIGHT;
11 | window.forge.swapThemeCSS(localStorage.theme);
12 | });
13 | };
14 |
--------------------------------------------------------------------------------
/js/theme-switch.js:
--------------------------------------------------------------------------------
1 | /*
2 | Initializes theme switching
3 | Either call before enabling toggler or in the document head
4 | */
5 |
6 | window.forge = {
7 | THEME_LIGHT: 'light',
8 | THEME_DARK: 'dark',
9 | swapThemeCSS: function (activeTheme) {
10 | var stylesheets = document.styleSheets;
11 | var length = stylesheets.length;
12 | var i;
13 |
14 | for(i = 0; i < length; i++) {
15 | var ss = stylesheets[i];
16 | if (!ss.ownerNode.dataset.theme) {
17 | continue;
18 | }
19 | ss.disabled = ss.ownerNode.dataset.theme !== activeTheme;
20 | }
21 |
22 | }
23 | };
24 |
25 | if (!localStorage.theme) {
26 | localStorage.theme = window.forge.THEME_LIGHT;
27 | }
28 |
29 | window.forge.swapThemeCSS(localStorage.theme);
30 |
--------------------------------------------------------------------------------
/runTestPageGen.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | ARGS="./python/page_generator.py --webout ./out/ --metaout ./out --config ./config/global_overrides.json --webroot https://files.minecraftforge.net --downloadroot https://maven.minecraftforge.net --static file://$(pwd)/static/ --folder ./maven --templates ./templates/ --local-data"
3 | python3 $ARGS promote net.minecraftforge:forge 1.16.5-36.1.0 recommended
4 | python3 $ARGS promote net.minecraftforge:forge 1.16.5-36.1.2 latest
5 | python3 $ARGS promote net.minecraftforge:forge 1.18.1-39.1.0 recommended
6 | python3 $ARGS promote net.minecraftforge:forge 1.18.1-39.1.2 latest
7 | python3 $ARGS promote net.minecraftforge:forge 1.18.2-40.0.8 latest
8 | python3 $ARGS promote net.minecraftforge:froge 23w13a_or_b-april.2023.13.b.8 latest
9 | python3 $ARGS promote net.minecraftforge:froge 23w17a-2023.17.a.8 latest
10 | python3 $ARGS promote net.minecraftforge:froge 1.20.1-pre1-46.0.8 latest
11 | python3 $ARGS promote net.minecraftforge:froge 1.19.4-45.0.0 latest
--------------------------------------------------------------------------------
/sass/_highlighting_dark.scss:
--------------------------------------------------------------------------------
1 | .hljs-strong,
2 | .hljs-emphasis {
3 | color: #a8a8a2;
4 | }
5 |
6 | .hljs-bullet,
7 | .hljs-quote,
8 | .hljs-link,
9 | .hljs-number,
10 | .hljs-regexp,
11 | .hljs-literal {
12 | color: #6896ba;
13 | }
14 |
15 | .hljs-code,
16 | .hljs-selector-class {
17 | color: #a6e22e;
18 | }
19 |
20 | .hljs-emphasis {
21 | font-style: italic;
22 | }
23 |
24 | .hljs-keyword,
25 | .hljs-selector-tag,
26 | .hljs-section,
27 | .hljs-attribute,
28 | .hljs-name,
29 | .hljs-variable {
30 | color: #cb7832;
31 | }
32 |
33 | .hljs-params {
34 | color: #b9b9b9;
35 | }
36 |
37 | .hljs-string {
38 | color: #6a8759;
39 | }
40 |
41 | .hljs-subst,
42 | .hljs-type,
43 | .hljs-built_in,
44 | .hljs-builtin-name,
45 | .hljs-symbol,
46 | .hljs-selector-id,
47 | .hljs-selector-attr,
48 | .hljs-selector-pseudo,
49 | .hljs-template-tag,
50 | .hljs-template-variable,
51 | .hljs-addition {
52 | color: #e0c46c;
53 | }
54 |
55 | .hljs-comment,
56 | .hljs-deletion,
57 | .hljs-meta {
58 | color: #7f7f7f;
59 | }
--------------------------------------------------------------------------------
/sass/_layout_screens.scss:
--------------------------------------------------------------------------------
1 | /*
2 | Style adjustments required to make the generic layout look good on any system.
3 | */
4 | // Mobile only elements
5 | .mobile-only {
6 | display: none;
7 | }
8 |
9 | @media screen and (max-width: 1720px) {
10 | .wrapper {
11 | width: 100%;
12 | }
13 | }
14 |
15 | @media screen and (max-width: $mobile-break) {
16 | header {
17 | .wrapper {
18 | flex-direction: column;
19 | }
20 |
21 | nav, .search, .user-panel {
22 | margin-left: 0;
23 | }
24 |
25 | .user-panel {
26 | padding-left: 0;
27 | }
28 |
29 | nav {
30 | margin-top: 0.2rem;
31 | }
32 |
33 | .search, .user-panel {
34 | margin-top: 0.7rem;
35 | }
36 |
37 | .search {
38 | flex-grow: 1;
39 | align-self: stretch;
40 | }
41 | }
42 | }
43 |
44 | @media screen and (max-width: 679px) {
45 | .mobile-only {
46 | display: block;
47 | }
48 |
49 | header {
50 | .user-panel {
51 | flex-direction: column;
52 |
53 | .user-panel-links {
54 | margin-left: 0;
55 | }
56 | }
57 | }
58 | }
--------------------------------------------------------------------------------
/templates/page_directory_body.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Tracked project index
4 |
5 |
6 |
7 | | Project |
8 | Maven |
9 | Time |
10 | Last version |
11 |
12 |
13 |
14 | {% for mvn, info in promos|dictsort %}
15 |
16 | | {{ info.name }} |
17 | {{ mvn }} |
18 | {{ info.last.timestamp | todatetime | humanformatdate }} |
19 | {{ info.last.version }}{% if info.last.mc and info.last.mc != 'default' %} for Minecraft {{ info.last.mc }}{% endif %} |
20 |
21 | {% endfor %}
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3.3'
2 | services:
3 | pagegen-webhook:
4 | image: pagegen-webhook:latest
5 | build:
6 | dockerfile: Dockerfile-webhook
7 | context: .
8 | container_name: pagegen-webhook
9 | restart: 'always'
10 | environment:
11 | - TZ=America/Los_Angeles
12 | ports:
13 | - 5000:5000
14 | volumes:
15 | - ./test/maven:/in
16 | - ./test/out:/out
17 | - ./test/config:/config
18 | labels:
19 | traefik.enable: 'true'
20 | traefik.http.routers.pagegen.entrypoints: 'websecure'
21 | traefik.http.routers.pagegen.middlewares: 'pagegen-prefix'
22 | traefik.http.routers.pagegen.rule: 'Host(`webhooks.minecraftforge.net`) && PathPrefix(`/pagegen/`)'
23 | traefik.http.services.pagegen.loadbalancer.server.port: 5000
24 | traefik.http.middlewares.pagegen-prefix.stripprefix.prefixes: '/pagegen'
25 | traefik.http.middlewares.pagegen-prefix.stripprefix.forceSlash: true
26 | pagegen:
27 | image: pagegen:latest
28 | build:
29 | context: .
30 | container_name: pagegen
31 | restart: 'always'
32 | environment:
33 | - TZ=America/Los_Angeles
--------------------------------------------------------------------------------
/runTestPageGen.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | set WEB_ROOT=https://files.minecraftforge.net
3 | set DOWNLOAD_ROOT=https://maven.minecraftforge.net
4 | set STATIC_DIR=file://%cd:\=/%/static/
5 | set ARGS=./python/page_generator.py --webout "./out/" --metaout "./out" --config "./config/global_overrides.json" --webroot "%WEB_ROOT%" --downloadroot "%DOWNLOAD_ROOT%" --static "%STATIC_DIR%" --folder "./maven" --templates "./templates/" --local-data
6 | python %ARGS% promote net.minecraftforge:forge 1.16.5-36.1.0 recommended
7 | python %ARGS% promote net.minecraftforge:forge 1.16.5-36.1.2 latest
8 | python %ARGS% promote net.minecraftforge:forge 1.18.1-39.1.0 recommended
9 | python %ARGS% promote net.minecraftforge:forge 1.18.1-39.1.2 latest
10 | python %ARGS% promote net.minecraftforge:forge 1.18.2-40.0.8 latest
11 | python %ARGS% promote net.minecraftforge:froge 23w13a_or_b-april.2023.13.b.8 latest
12 | python %ARGS% promote net.minecraftforge:froge 23w17a-2023.17.a.8 latest
13 | python %ARGS% promote net.minecraftforge:froge 1.20.1-pre1-46.0.8 latest
14 | python %ARGS% promote net.minecraftforge:froge 1.19.4-45.0.8 latest
15 | python %ARGS% promote net.minecraftforge:froge 1.20-rc1-46.1.8 latest
--------------------------------------------------------------------------------
/sass/_highlighting_light.scss:
--------------------------------------------------------------------------------
1 | .hljs-subst,
2 | .hljs-title {
3 | font-weight: normal;
4 | color: #000;
5 | }
6 |
7 | .hljs-comment,
8 | .hljs-quote {
9 | color: #808080;
10 | font-style: italic;
11 | }
12 |
13 | .hljs-meta {
14 | color: #808000;
15 | }
16 |
17 | .hljs-tag {
18 | background: #efefef;
19 | }
20 |
21 | .hljs-section,
22 | .hljs-name,
23 | .hljs-literal,
24 | .hljs-keyword,
25 | .hljs-selector-tag,
26 | .hljs-type,
27 | .hljs-selector-id,
28 | .hljs-selector-class {
29 | font-weight: bold;
30 | color: #000080;
31 | }
32 |
33 | .hljs-attribute,
34 | .hljs-number,
35 | .hljs-regexp,
36 | .hljs-link {
37 | font-weight: bold;
38 | color: #0000ff;
39 | }
40 |
41 | .hljs-number,
42 | .hljs-regexp,
43 | .hljs-link {
44 | font-weight: normal;
45 | }
46 |
47 | .hljs-string {
48 | color: #008000;
49 | font-weight: bold;
50 | }
51 |
52 | .hljs-symbol,
53 | .hljs-bullet,
54 | .hljs-formula {
55 | color: #000;
56 | background: #d0eded;
57 | font-style: italic;
58 | }
59 |
60 | .hljs-doctag {
61 | text-decoration: underline;
62 | }
63 |
64 | .hljs-variable,
65 | .hljs-template-variable {
66 | color: #660e7a;
67 | }
68 |
69 | .hljs-addition {
70 | background: #baeeba;
71 | }
72 |
73 | .hljs-deletion {
74 | background: #ffc8bd;
75 | }
76 |
77 | .hljs-emphasis {
78 | font-style: italic;
79 | }
80 |
81 | .hljs-strong {
82 | font-weight: bold;
83 | }
--------------------------------------------------------------------------------
/images/favicons/safari-pinned-tab.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
29 |
--------------------------------------------------------------------------------
/sass/_privacy.scss:
--------------------------------------------------------------------------------
1 | /*
2 | Styles related to privacy-related settings.
3 | */
4 |
5 | // Bar under the navigation for privacy disclaimer
6 | .privacy-disclaimer {
7 | position: -webkit-sticky;
8 | position: sticky;
9 | display: none;
10 | top: 0;
11 | width: 100%;
12 | margin-top: -1rem;
13 | margin-bottom: 1rem;
14 |
15 | z-index: 1000000;
16 |
17 | background: #2f2f2f;
18 | color: #eeeeee;
19 |
20 | .wrapper {
21 | padding: 2rem 1rem;
22 | display: flex;
23 | flex-wrap: wrap;
24 | align-items: center;
25 | }
26 |
27 | &-text a {
28 | color: lighten($accent6, 30%);
29 |
30 | &:hover, &:active, &:focus {
31 | color: lighten($accent6, 35%);
32 | }
33 | }
34 |
35 | &-links {
36 | margin-left: auto;
37 |
38 | a {
39 | margin-left: 0.5rem;
40 | }
41 |
42 | a.btn-cookie-disclaimer-decline {
43 | color: #eeeeee;
44 |
45 | &:hover, &:active, &:focus {
46 | color: #fafafa;
47 | }
48 | }
49 | }
50 | }
51 |
52 | .privacy-policy {
53 | display: flex;
54 | flex-direction: column;
55 |
56 | .privacy-settings {
57 | margin: 1rem 0;
58 |
59 | a.btn-privacy-settings-decline {
60 | margin-left: 0.5rem;
61 | }
62 | }
63 |
64 | .donation-links {
65 | margin: 1rem 0;
66 | list-style-type: none;
67 | padding-left: 0.5rem;
68 |
69 | li {
70 | margin-bottom: 0.25rem;
71 | }
72 |
73 | i {
74 | text-align: center;
75 | width: 1rem;
76 | margin-right: 0.5rem;
77 | font-size: 1.1rem;
78 | }
79 | }
80 |
81 | .privacy-advertisers-list {
82 | padding-left: 2rem;
83 | column-count: 4;
84 | column-gap: 2.5rem;
85 | margin-bottom: 1rem;
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/sass/_scrollpane.scss:
--------------------------------------------------------------------------------
1 | .jspContainer {
2 | overflow: hidden;
3 | position: relative;
4 | }
5 |
6 | .jspPane {
7 | position: absolute;
8 | padding: 0 !important;
9 | }
10 |
11 | .jspVerticalBar {
12 | position: absolute;
13 | top: 0;
14 | right: 0;
15 | width: 8px;
16 | height: 100%;
17 | }
18 |
19 | .jspHorizontalBar {
20 | position: absolute;
21 | bottom: 0;
22 | left: 0;
23 | width: 100%;
24 | height: 8px;
25 | }
26 |
27 | .jspCap {
28 | display: none;
29 | }
30 |
31 | .jspHorizontalBar .jspCap {
32 | float: left;
33 | }
34 |
35 | .jspTrack {
36 | background: $scrollbar-track-bg;
37 | position: relative;
38 | }
39 |
40 | .jspDrag {
41 | background: $scrollbar-drag-bg;
42 | position: relative;
43 | top: 0;
44 | left: 0;
45 | cursor: pointer;
46 | transition: background 0.4s ease-in-out;
47 |
48 | &:hover, &:active, &:focus {
49 | background: $scrollbar-drag-hover-bg;
50 | }
51 | }
52 |
53 | .jspHorizontalBar .jspTrack,
54 | .jspHorizontalBar .jspDrag {
55 | float: left;
56 | height: 100%;
57 | }
58 |
59 | .jspArrow {
60 | background: #50506d;
61 | text-indent: -20000px;
62 | display: block;
63 | cursor: pointer;
64 | padding: 0;
65 | margin: 0;
66 | }
67 |
68 | .jspArrow.jspDisabled {
69 | cursor: default;
70 | background: #80808d;
71 | }
72 |
73 | .jspVerticalBar .jspArrow {
74 | height: 16px;
75 | }
76 |
77 | .jspHorizontalBar .jspArrow {
78 | width: 16px;
79 | float: left;
80 | height: 100%;
81 | }
82 |
83 | .jspVerticalBar .jspArrow:focus {
84 | outline: none;
85 | }
86 |
87 | .jspCorner {
88 | background: #eeeef4;
89 | float: left;
90 | height: 100%;
91 | }
92 |
93 | /* Yuk! CSS Hack for IE6 3 pixel bug :( */
94 | * html .jspCorner {
95 | margin: 0 -3px 0 0;
96 | }
97 |
--------------------------------------------------------------------------------
/sass/_theme_dark.scss:
--------------------------------------------------------------------------------
1 | $accent1: #2e4460;
2 | $accent2: #de9e59;
3 | $accent3: #c9d44c;
4 | $accent4: #cc4523;
5 | $accent5: #09687C;
6 | $accent6: #378eda;
7 | $accent7: #DFA86A;
8 |
9 | $body-bg: #2B2B2B !default;
10 | $body-color: #bbbbbb !default;
11 | $section-bg: #3C3F41 !default;
12 | $section-highlight: darken($section-bg, 5%) !default;
13 | $section-content-bg: lighten($section-bg, 3%);
14 | $section-content-highlight: lighten($section-bg, 1%);
15 | $header-bg: #2e4460 !default;
16 |
17 | $text-muted: #909090 !default;
18 |
19 | $pagination-bg: #63676c !default;
20 | $pagination-color: #b4bcc1 !default;
21 |
22 | $thread-sticky: #2d3d49;
23 | $thread-locked: #4b4c4e;
24 |
25 | $link-color: $accent6 !default;
26 | $link-decoration: none !default;
27 | $link-hover-color: #44a7ff !default;
28 | $link-hover-decoration: none !default;
29 |
30 | $scrollbar-track-bg: darken($section-bg, 5%);
31 | $scrollbar-drag-bg: #222425;
32 | $scrollbar-drag-hover-bg: $accent7;
33 |
34 | .prettyprint {
35 | background-color: #2b2b2b;
36 | color: #a9b7c6;
37 |
38 | .lit { // literal
39 | color: #6897bb;
40 | }
41 |
42 | .kwd { // keyword
43 | font-weight: bold;
44 | color: #cc7832;
45 | }
46 |
47 | .typ { // type
48 | color: #4e807d;
49 | }
50 |
51 | .str { // string
52 | color: #6a8759;
53 | }
54 |
55 | .pun { // punctuation
56 | color: #e8bf6a;
57 | }
58 |
59 | .com { // comment
60 | color: #629755;
61 | font-style: italic;
62 | }
63 |
64 | .pln { // plain
65 | color: #a9b7c6;
66 | }
67 |
68 | .dec { // declaration
69 | color: #e8bf6a;
70 | }
71 |
72 | .tag { // html tag
73 | color: #e8bf6a;
74 | }
75 |
76 | .atn { // html attribute name
77 | color: #a9b7c6;
78 | }
79 |
80 | .atv { // html attribute value
81 | color: #a5c261;
82 | }
83 | }
--------------------------------------------------------------------------------
/sass/_theme_light.scss:
--------------------------------------------------------------------------------
1 | $accent1: #26303d;
2 | $accent2: #de9e59;
3 | $accent3: #c9d44c;
4 | $accent4: #cb3d35;
5 | $accent5: #1b4e7e;
6 | $accent6: #185b98;
7 | $accent7: #DFA86A;
8 |
9 | $body-bg: #EFF1F3 !default;
10 | $body-color: #373a3c !default;
11 | $section-bg: #fff !default;
12 | $section-highlight: darken($section-bg, 14%) !default;
13 | $section-content-bg: darken($section-bg, 2%);
14 | $section-content-highlight: darken($section-bg, 4%);
15 | $header-bg: #26303d;
16 |
17 | $text-muted: #8c9195 !default;
18 |
19 | $pagination-bg: #BCC1C5 !default;
20 | $pagination-color: #fbf9f9 !default;
21 |
22 | $thread-sticky: lighten($accent1, 75%);
23 | $thread-locked: darken(#fff, 5%);
24 |
25 | $link-color: $accent6 !default;
26 | $link-decoration: none !default;
27 | $link-hover-color: darken($accent6, 20%) !default;
28 | $link-hover-decoration: none !default;
29 |
30 | $scrollbar-track-bg: darken($section-bg, 15%);
31 | $scrollbar-drag-bg: darken($section-bg, 30%);
32 | $scrollbar-drag-hover-bg: $accent7;
33 |
34 | .prettyprint {
35 | background-color: #ffffff;
36 | color: #000000;
37 |
38 | .lit { // literal
39 | color: #0000ff;
40 | }
41 |
42 | .kwd { // keyword
43 | font-weight: bold;
44 | color: #000080;
45 | }
46 |
47 | .typ { // type
48 | color: #20999d;
49 | }
50 |
51 | .str { // string
52 | color: #008000;
53 | }
54 |
55 | .pun { // punctuation
56 | color: #000000;
57 | }
58 |
59 | .com { // comment
60 | color: #808080;
61 | font-style: italic;
62 | }
63 |
64 | .pln { // plain
65 | color: #000000;
66 | }
67 |
68 | .dec { // declaration
69 | color: #000080;
70 | }
71 |
72 | .tag { // html tag
73 | color: #000080;
74 | }
75 |
76 | .atn { // html attribute name
77 | color: #0000ff;
78 | }
79 |
80 | .atv { // html attribute value
81 | color: #008000;
82 | }
83 | }
--------------------------------------------------------------------------------
/templates/page_footer.html:
--------------------------------------------------------------------------------
1 |
14 |
15 |
16 |
17 |
18 |
19 | {%- if md.global_config['enable_adsense'] %}
20 |
21 | {%- else %}
22 |
23 | {%- endif %}
24 |
25 |
26 | {% if artifact and artifact.config['analytics'] %}{{ artifact.config['analytics'] }}{% endif %}
27 |
28 | {%- if artifact and artifact.config['body_end'] %}
29 | {%- for line in artifact.config['body_end'] %}
30 | {{ line }}
31 | {%- endfor %}
32 | {%- endif %}
33 |