Autogenerated og images
Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>
This commit is contained in:
67 files changed
+2530
-771
No files matched your search
@@ -3,6 +3,7 @@ title: "1.18 Release, MCProtocolLib, Refactors & More!"
|
||||
slug: "1-18-release-and-more"
|
||||
authors: RednedEpic
|
||||
hide_table_of_contents: false
|
||||
description: "In this post, we will be covering all the changes that led up to the 1.18 release."
|
||||
---
|
||||
Hi everyone 👋
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ title: "Looking back at 2022"
|
||||
slug: "looking-back-at-2022"
|
||||
authors: Camotoy
|
||||
hide_table_of_contents: false
|
||||
description: "A look back at the year of 2022 for Geyser."
|
||||
---
|
||||
Hi.
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ title: "Four Years of Geyser"
|
||||
slug: "four-years-of-geyser"
|
||||
authors: RednedEpic
|
||||
hide_table_of_contents: false
|
||||
description: "Geyser is now four years old!"
|
||||
---
|
||||
|
||||
Hi everyone,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Floodgate API
|
||||
description: Floodgate has an API to allow servers to get information about the Bedrock client. It also allows plugins access to Cumulus, an API to send and collect form data from Bedrock players.
|
||||
---
|
||||
|
||||
Floodgate has an API to extend what is possible and allow servers to get information about the Bedrock client. It also allows other plugins access to [Cumulus](/geyser/forms/)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Commands
|
||||
description: Commands and their associated permission nodes for Floodgate.
|
||||
---
|
||||
|
||||
| Command | Permission | Description |
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: FAQ
|
||||
description: Frequently asked questions about Floodgate such as changing prefixes, obtaining Bedrock player UUIDs, and using Floodgate with PlaceholderAPI and Skript.
|
||||
---
|
||||
|
||||
import { Questions, Q, A } from "../../src/components/Questions";
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Features
|
||||
description: Learn about the features of Floodgate 2.0, including the whitelist command and skin uploading.
|
||||
---
|
||||
|
||||
## Whitelist command {#whitelist-command}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Floodgate
|
||||
permalink: /floodgate/
|
||||
description: 'Floodgate is a hybrid mode plugin that allows Minecraft: Bedrock Accounts to join Minecraft: Java Edition servers without needing a Minecraft: Java Edition account.'
|
||||
---
|
||||
|
||||
# Floodgate
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Issues
|
||||
description: Troubleshoot common Floodgate issues. Get solutions for connection problems, configuration errors, and known limitations.
|
||||
---
|
||||
|
||||
# Known Issues & Caveats
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Linking
|
||||
description: Learn how to link your Java and Bedrock Minecraft accounts for crossplay. Understand builtin Global Linking or how to set up optional local linking.
|
||||
---
|
||||
|
||||
## What is Global Linking? {#what-is-global-linking}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: FloodgatePlayer
|
||||
description: FloodgatePlayer is the main class for accessing bedrock player data.
|
||||
---
|
||||
|
||||
FloodgatePlayer is something that every player who's connect through Floodgate has.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Floodgate Setup
|
||||
page_sidebar: false
|
||||
description: Set up Floodgate to allow Bedrock users to authenticate with their Bedrock account on your Java Minecraft server.
|
||||
---
|
||||
|
||||
import Tabs from "@theme/Tabs";
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
---
|
||||
title: Floodgate Fabric Setup
|
||||
description: Learn how to set up Floodgate on your Fabric server.
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
1. Download Floodgate-Fabric from the [modrinth page](https://modrinth.com/mod/floodgate).
|
||||
2. Place the Floodgate-Fabric.jar in the `mods` folder, and restart the server. **You also need [FabricAPI](https://modrinth.com/mod/fabric-api) installed.**
|
||||
3. Change `auth-type` in Geyser's config to `floodgate`.
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
---
|
||||
title: Floodgate Paper / Spigot Setup
|
||||
description: Learn how to set up Floodgate on your Paper or Spigot server.
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
1. Download Floodgate-Spigot from the [download page](https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot).
|
||||
2. Place the Floodgate-Spigot.jar in the `plugins` folder, and restart the server.
|
||||
3. Change `auth-type` in Geyser's config to `floodgate`.
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
---
|
||||
title: Floodgate Proxy Servers Setup
|
||||
description: Learn how to set up Floodgate on your Bungee, Waterfall, or Velocity server.
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
:::info
|
||||
You only need to install Floodgate on the BungeeCord or Velocity proxy server, unless you want to use the Floodgate API on the backend servers.
|
||||
Additionally, it will display Bedrock edition skins properly.
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
---
|
||||
title: Floodgate Geyser Standalone Setup
|
||||
description: Learn how to set up Floodgate with Geyser Standalone.
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
:::info
|
||||
To be able to use Floodgate authentication, you need to be able to install Floodgate on the Java server you are connecting to.
|
||||
:::
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
---
|
||||
title: Floodgate ViaProxy Setup
|
||||
description: Learn how to set up Floodgate with ViaProxy.
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
:::info
|
||||
To be able to use Floodgate authentication, you need to be able to install Floodgate on the Java server you are connecting to.
|
||||
:::
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Anticheat Compatibility
|
||||
description: A list of community compiled list of Anticheats and their compatibility with Geyser.
|
||||
---
|
||||
|
||||
:::caution
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Geyser API
|
||||
description: The Geyser API allows you to interact with Geyser in your own plugins, mods, or extensions.
|
||||
---
|
||||
|
||||
Geyser has an API to extend what is possible with Geyser, and to allow you to interact with Geyser in your own plugins, mods, or extensions.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Commands and Permissions
|
||||
description: Commands and their associated permission nodes for Geyser.
|
||||
---
|
||||
|
||||
# Commands and Permissions
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Common Issues
|
||||
description: Common issues that people may encounter with Geyser and potential fixes for them.
|
||||
---
|
||||
|
||||
# Common Issues
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Creating a Startup Script
|
||||
description: Learn how to create a startup script for Geyser-Standalone.
|
||||
---
|
||||
|
||||
# Creating a Startup Script for Geyser-Standalone
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Current Limitations
|
||||
description: Current known limitations of Geyser.
|
||||
---
|
||||
|
||||
# Current Limitations
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Custom blocks with Geyser
|
||||
description: Geysers allows custom blocks to be mapped to Vanilla Java blockstates or modded blocks to allow custom block models.
|
||||
---
|
||||
|
||||
# Custom blocks with Geyser
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Custom items with Geyser
|
||||
description: Geyser allows custom Bedrock items to be added for an equivalency to Vanilla Java item predicates or modded items.
|
||||
---
|
||||
|
||||
# Custom items with Geyser
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Custom skulls with Geyser
|
||||
description: Geyser allows mapping of custom skulls to custom blocks for use in inventories and on entities.
|
||||
---
|
||||
|
||||
# Custom skulls with Geyser
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Geyser Events
|
||||
description: Geyser has a powerful event system that allows you to listen to events that are sent by Geyser. Events are at the heart of Geyser Extensions, and can be used by plugins and mods as well.
|
||||
---
|
||||
|
||||
# Geyser Events
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Geyser Extensions
|
||||
description: Geyser Extensions are the equivalent of "plugins", but specifically for the Geyser platform. This brings the advantage of them being platform-agnostic, meaning that you won't have to worry about supporting all platforms individually.
|
||||
---
|
||||
|
||||
# Geyser Extensions
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Frequently Asked Questions
|
||||
description: Frequently asked questions about Geyser, including how it works, what plugins are incompatible, and more.
|
||||
---
|
||||
|
||||
import { Questions, Q, A } from "../../src/components/Questions";
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Fixing 'Unable to Connect to World'
|
||||
description: Common issues and solutions for the 'Unable to Connect to World' error.
|
||||
---
|
||||
|
||||
## Fixing 'Unable to Connect to World' errors {#fixing-unable-to-connect-to-world-errors}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Forms and Cumulus
|
||||
description: Cumulus is the Forms API used in Geyser and Floodgate, and is available for use in projects that extend Geyser or Floodgate.
|
||||
---
|
||||
|
||||
# What is Cumulus?
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Getting Started with the API
|
||||
description: 'A primer on how to use the Geyser and Floodgate APIs.'
|
||||
---
|
||||
|
||||
To start, add the Open Collaboration repository to your project:
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Geyser Command Line Arguments and System Properties
|
||||
description: Geyser offers a few command line arguments/system properties to allow you to configure Geyser without editing the config files.
|
||||
---
|
||||
|
||||
# Geyser Command Line Arguments and System Properties
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Global API
|
||||
description: 'The Global API is a service that allows for global linking, skin uploading, and access to various info about all Bedrock players that have joined Floodgate servers before.'
|
||||
---
|
||||
|
||||
The Global API is available for every server. It currently includes: [Global Linking](/floodgate/linking#what-is-global-linking), [skin uploading](/floodgate/features#what-is-skin-uploading), getting a xuid by gamertag, and getting a gamertag by xuid.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Geyser
|
||||
permalink: /geyser/
|
||||
description: 'Geyser is a bridge between Minecraft: Bedrock Edition and Minecraft: Java Edition, closing the gap from those wanting to play true cross-platform.'
|
||||
---
|
||||
|
||||
import { Versions } from '../../src/components/Versions'
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: playit.gg Setup
|
||||
description: How to set up playit.gg to use Geyser without port forwarding.
|
||||
---
|
||||
|
||||
## Prerequisites {#prerequisites}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Port forwarding
|
||||
description: Information on how to set up UDP port forwarding required for Geyser.
|
||||
---
|
||||
|
||||
# Port forwarding
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Geyser and Secure Chat
|
||||
description: Information about disabling secure chat to allow Bedrock players to chat on Java servers.
|
||||
---
|
||||
|
||||
In the 1.19 Java Edition updates, a mechanism for reporting player chat messages to Mojang was implemented.
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Setup
|
||||
page_sidebar: false
|
||||
description: Guides to setup Geyser on all supported platforms
|
||||
---
|
||||
|
||||
import Tabs from "@theme/Tabs";
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
---
|
||||
title: Geyser Hosting Provider Modded Setup
|
||||
description: Learn how to set up Geyser on your Fabric or NeoForge server from a hosting provider.
|
||||
---
|
||||
|
||||
import { Versions } from '../../../../src/components/Versions'
|
||||
|
||||
:::caution
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
---
|
||||
title: Geyser Hosting Provider Paper / Spigot Setup
|
||||
description: Learn how to set up Geyser on a Paper or Spigot server from a hosting provider.
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
import { Versions } from '../../../../src/components/Versions'
|
||||
|
||||
:::info
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
---
|
||||
title: Geyser Hosting Provider Proxy Servers Setup
|
||||
description: Learn how to set up Geyser on your Bungee, Waterfall, or Velocity server from a hosting provider.
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
import { Versions } from '../../../../src/components/Versions'
|
||||
|
||||
:::info
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
---
|
||||
title: Geyser Self-Hosted Modded Setup
|
||||
description: Learn how to set up Geyser on your self-hosted Fabric or NeoForge server.
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
import { Versions } from '../../../../src/components/Versions'
|
||||
|
||||
:::caution
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
---
|
||||
title: Geyser Self-Hosted Paper / Spigot Setup
|
||||
description: Learn how to set up Geyser on your self-hosted Paper or Spigot server.
|
||||
---
|
||||
|
||||
import { Versions } from '../../../../src/components/Versions'
|
||||
|
||||
:::info
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
---
|
||||
title: Geyser Self-Hosted Proxy Servers Setup
|
||||
description: Learn how to set up Geyser on your self-hosted Bungee, Waterfall, or Velocity server.
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
|
||||
import { Versions } from '../../../../src/components/Versions'
|
||||
|
||||
:::info
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
---
|
||||
title: Geyser Standalone Setup
|
||||
description: Learn how to set up Geyser Standalone, a standalone Java program that allows you to connect Bedrock players to your Java Edition server.
|
||||
hide_title: true
|
||||
---
|
||||
|
||||
:::info
|
||||
You need to have Java 17 or higher installed to run Geyser. To run Geyser Standalone on Android, see the bottom of this page.
|
||||
:::
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
---
|
||||
title: Geyser ViaProxy Setup
|
||||
description: Learn how to set up Geyser with ViaProxy.
|
||||
---
|
||||
|
||||
1. [Setup ViaProxy](https://github.com/ViaVersion/ViaProxy?tab=readme-ov-file#usage-for-players-gui).
|
||||
2. Download the plugin from [the download page](https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/viaproxy).
|
||||
3. Place the Geyser-ViaProxy.jar in the `plugins` folder, and restart ViaProxy.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Supported Hosting Providers
|
||||
description: A list of hosting providers and their support for Geyser.
|
||||
---
|
||||
|
||||
import { Provider } from "../../src/components/Provider";
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Supported Languages & Translations
|
||||
description: Geyser supports a wide variety of languages to offer the best experience for players all over the globe. Community members can help translate Geyser into more languages.
|
||||
---
|
||||
|
||||
Geyser supports a wide variety of languages to offer the best experience for players all over the globe.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Understanding the Config
|
||||
description: This page covers basic information about the Geyser config and the function of each option.
|
||||
---
|
||||
|
||||
This page covers basic information about the Geyser config and what each option does. Though they are explained in the configuration itself, this explains what each option does in more detail.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Using Geyser with Consoles
|
||||
description: Information on how to use Geyser with consoles, including how to join servers on console versions of Bedrock Edition.
|
||||
---
|
||||
|
||||
# Using Geyser with Consoles
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Community Geyser Projects
|
||||
description: A list of community-compiled plugins, extensions and tools that work with Geyser.
|
||||
---
|
||||
|
||||
Below is a list of community-compiled plugins, extensions and tools that work with Geyser.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Developer Guide
|
||||
description: A guide for developers who want to contribute to GeyserMC projects.
|
||||
---
|
||||
|
||||
## Compiling {#compiling}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Discord Bot Usage
|
||||
description: Information about how to use the Geyser Discord bot.
|
||||
---
|
||||
|
||||
Our discord bot provides some very useful toos to debug/issue track your server. We will go in-depth on how to use the bot commands and its tools.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: GeyserConnect
|
||||
description: GeyserConnect is a extension for Geyser that allows you to join multiple servers using a single Geyser proxy.
|
||||
---
|
||||
|
||||
GeyserConnect is a extension for Geyser that allows you to join multiple servers using a single GeyserMC proxy.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: GeyserOptionalPack
|
||||
description: GeyserOptionalPack is a Bedrock resource pack that fixes parity issues with Geyser to bring Bedrock Edition in line with Java Edition.
|
||||
---
|
||||
|
||||
# GeyserOptionalPack
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Hurricane
|
||||
description: Hurricane is a Paper / Spigot plugin and Fabric mod that fixes some bugs that otherwise cannot be fixed without server-side modification.
|
||||
---
|
||||
|
||||
# Hurricane
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
title: Other
|
||||
permalink: /other/
|
||||
description: Information about other Geyser-related projects.
|
||||
---
|
||||
|
||||
# Other
|
||||
@@ -1,5 +1,6 @@
|
||||
---
|
||||
title: Test Server
|
||||
description: Information about joining and using the Geyser test server.
|
||||
---
|
||||
|
||||
### Details {#details}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { themes as prismThemes } from 'prism-react-renderer';
|
||||
import type { Config } from '@docusaurus/types';
|
||||
import type * as Preset from '@docusaurus/preset-classic';
|
||||
import { docOgRenderer, blogOgRenderer, pageOgRenderer } from './src/renderer/ImageRenderers';
|
||||
|
||||
const config: Config = {
|
||||
title: 'GeyserMC',
|
||||
@@ -72,6 +73,17 @@ const config: Config = {
|
||||
}
|
||||
}
|
||||
},
|
||||
],
|
||||
[
|
||||
'@kas-tle/docusaurus-og',
|
||||
{
|
||||
path: './preview-images',
|
||||
imageRenderers: {
|
||||
'docusaurus-plugin-content-docs': docOgRenderer,
|
||||
'docusaurus-plugin-content-pages': pageOgRenderer,
|
||||
'docusaurus-plugin-content-blog': blogOgRenderer,
|
||||
},
|
||||
},
|
||||
]
|
||||
],
|
||||
themes: ["docusaurus-theme-openapi-docs"],
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
"@fortawesome/free-regular-svg-icons": "^6.5.1",
|
||||
"@fortawesome/free-solid-svg-icons": "^6.5.1",
|
||||
"@fortawesome/react-fontawesome": "^0.2.0",
|
||||
"@kas-tle/docusaurus-og": "https://github.com/Kas-tle/docusaurus-og",
|
||||
"@mdx-js/react": "^3.0.0",
|
||||
"clsx": "^1.2.1",
|
||||
"docusaurus-plugin-openapi-docs": "^3.0.0-beta.5",
|
||||
|
||||
@@ -94,7 +94,7 @@ const DownloadPage: React.FC = () => (
|
||||
export default function Download(): JSX.Element {
|
||||
return (
|
||||
<Layout
|
||||
title={`Geyser Downloads`}
|
||||
title={`Download`}
|
||||
description="Download the latest versions of our various projects."
|
||||
>
|
||||
<main>
|
||||
|
||||
+2
-4
@@ -1,5 +1,4 @@
|
||||
import clsx from 'clsx';
|
||||
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
||||
import Layout from '@theme/Layout';
|
||||
import HomepageFeatures from '@site/src/components/HomepageFeatures';
|
||||
import Heading from '@theme/Heading';
|
||||
@@ -28,11 +27,10 @@ function HomepageHeader() {
|
||||
}
|
||||
|
||||
export default function Home(): JSX.Element {
|
||||
const { siteConfig } = useDocusaurusContext();
|
||||
return (
|
||||
<Layout
|
||||
title={`Hello from ${siteConfig.title}`}
|
||||
description="Description will go into a meta tag in <head />"
|
||||
title="Geyser"
|
||||
description="Enable clients from Minecraft Bedrock Edition to join your Minecraft Java server."
|
||||
>
|
||||
<HomepageHeader />
|
||||
<main>
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
title: Markdown page example
|
||||
---
|
||||
|
||||
# Markdown page example
|
||||
|
||||
You don't need React to write simple standalone pages.
|
||||
@@ -0,0 +1,265 @@
|
||||
import React, { ReactSVGElement } from 'react';
|
||||
import type { DocsPageData, ImageRenderer, ImageGeneratorOptions, BlogPageData, PageData } from '@kas-tle/docusaurus-og';
|
||||
import { join } from 'path';
|
||||
import { readFileSync } from 'fs'
|
||||
import { faDownload, faHouse, faBlog, faBook, IconDefinition } from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
const geyserLogo = join(__dirname, '../../static/img/icons/geyser.png');
|
||||
const geyserLogoBase64 = `data:image/png;base64,${readFileSync(geyserLogo).toString('base64')}`;
|
||||
|
||||
const titleElement = ({ children }) => React.createElement(
|
||||
'label',
|
||||
{
|
||||
style: {
|
||||
fontSize: 72,
|
||||
fontWeight: 800,
|
||||
letterSpacing: 1,
|
||||
margin: '25px 225px 10px 0px',
|
||||
color: '#e3e3e3',
|
||||
wordBreak: 'break-word',
|
||||
}
|
||||
},
|
||||
children
|
||||
);
|
||||
|
||||
const docsSvgElement = faSvg(faBook);
|
||||
const blogSvgElement = faSvg(faBlog);
|
||||
const homeSvgElement = faSvg(faHouse);
|
||||
const downloadSvgElement = faSvg(faDownload);
|
||||
|
||||
const geyserLogoElement = React.createElement(
|
||||
'img',
|
||||
{
|
||||
src: geyserLogoBase64,
|
||||
style: {
|
||||
position: 'absolute',
|
||||
top: 20,
|
||||
right: 20,
|
||||
width: 225,
|
||||
height: 225,
|
||||
borderRadius: '50%',
|
||||
border: '10px solid #e3e3e3'
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
const headerElement = (header: string, svg: ReactSVGElement) => React.createElement(
|
||||
'div',
|
||||
{
|
||||
style: {
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
position: 'absolute',
|
||||
top: 20,
|
||||
left: 40,
|
||||
},
|
||||
},
|
||||
svg,
|
||||
React.createElement(
|
||||
'label',
|
||||
{
|
||||
style: {
|
||||
fontSize: 32,
|
||||
fontWeight: 600,
|
||||
letterSpacing: 1,
|
||||
color: '#e3e3e3',
|
||||
},
|
||||
},
|
||||
header,
|
||||
),
|
||||
)
|
||||
|
||||
const rootDivStyle: React.CSSProperties = {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
height: '100%',
|
||||
width: '100%',
|
||||
padding: '10px 40px',
|
||||
justifyContent: 'center',
|
||||
fontFamily: 'Montserrat',
|
||||
fontSize: 32,
|
||||
fontWeight: 400,
|
||||
backgroundColor: '#0f1b23',
|
||||
color: '#e3e3e3',
|
||||
borderBottom: '2rem solid rgb(37, 194, 160)',
|
||||
};
|
||||
|
||||
export const docOgRenderer: ImageRenderer<DocsPageData> = async (data, context) => {
|
||||
const element = React.createElement(
|
||||
'div',
|
||||
{ style: rootDivStyle },
|
||||
React.createElement(titleElement, null, data.metadata.title),
|
||||
React.createElement('div', null, data.metadata.description),
|
||||
geyserLogoElement,
|
||||
headerElement(docSectionPath(data.metadata.slug, context.siteConfig.title), docsSvgElement),
|
||||
);
|
||||
|
||||
return [
|
||||
element,
|
||||
await imageGeneratorOptions(),
|
||||
];
|
||||
};
|
||||
|
||||
export const blogOgRenderer: ImageRenderer<BlogPageData> = async (data, context) => {
|
||||
const isPost = data.pageType === 'post';
|
||||
|
||||
let posterImageElement = undefined;
|
||||
if (isPost && data.data.metadata.authors.length > 0) {
|
||||
// Create line of all author avatar images in top right corner
|
||||
const authorImages = data.data.metadata.authors.map(async author => React.createElement(
|
||||
'img',
|
||||
{
|
||||
src: await encodeRemoteImage(author.imageURL),
|
||||
style: {
|
||||
width: 112.5,
|
||||
height: 112.5,
|
||||
marginRight: 10,
|
||||
borderRadius: '50%',
|
||||
border: '10px solid #e3e3e3',
|
||||
},
|
||||
},
|
||||
));
|
||||
|
||||
posterImageElement = React.createElement(
|
||||
'div',
|
||||
{
|
||||
style: {
|
||||
display: 'flex',
|
||||
position: 'absolute',
|
||||
top: 20,
|
||||
right: 175,
|
||||
},
|
||||
},
|
||||
...await Promise.all(authorImages),
|
||||
);
|
||||
}
|
||||
|
||||
const element = React.createElement(
|
||||
'div',
|
||||
{ style: rootDivStyle },
|
||||
React.createElement(titleElement, null, isPost ? data.data.metadata.title : context.siteConfig.title + ' Blog'),
|
||||
React.createElement('div', null, isPost ? data.data.metadata.description : ''),
|
||||
geyserLogoElement,
|
||||
posterImageElement,
|
||||
headerElement(context.siteConfig.title + ' / Blog' + (isPost ? ` / ${new Date(data.data.metadata.date).toISOString().split('T')[0].replaceAll('-','.')}` : ''), blogSvgElement),
|
||||
);
|
||||
|
||||
return [
|
||||
element,
|
||||
await imageGeneratorOptions(),
|
||||
];
|
||||
};
|
||||
|
||||
export const pageOgRenderer: ImageRenderer<PageData> = async (data, context) => {
|
||||
const extraTitleLength = (' ' + context.siteConfig.titleDelimiter + ' ' + context.siteConfig.title).length;
|
||||
await data.document.load();
|
||||
|
||||
const title = (data.document.loaded && data.document.root.querySelector('title')?.textContent).slice(0, -extraTitleLength) || context.siteConfig.title;
|
||||
const description = (data.document.loaded && data.document.root.querySelector('meta[name="description"]').getAttribute('content')) || context.siteConfig.tagline;
|
||||
|
||||
const element = React.createElement(
|
||||
'div',
|
||||
{ style: rootDivStyle },
|
||||
React.createElement(titleElement, null, title),
|
||||
React.createElement('div', null, description),
|
||||
geyserLogoElement,
|
||||
headerElement(context.siteConfig.title + ' / ' + title, pageSvg(data.metadata.permalink)),
|
||||
);
|
||||
|
||||
return [
|
||||
element,
|
||||
await imageGeneratorOptions(),
|
||||
];
|
||||
};
|
||||
|
||||
const imageGeneratorOptions = async (): Promise<ImageGeneratorOptions> => {
|
||||
return {
|
||||
width: 1200,
|
||||
height: 600,
|
||||
fonts: [
|
||||
{
|
||||
name: 'Montserrat',
|
||||
data: await getTtfFont('Montserrat', ['ital', 'wght'], [0, 400]),
|
||||
weight: 400,
|
||||
style: 'normal',
|
||||
},
|
||||
{
|
||||
name: 'Montserrat',
|
||||
data: await getTtfFont('Montserrat', ['ital', 'wght'], [0, 600]),
|
||||
weight: 600,
|
||||
style: 'normal',
|
||||
},
|
||||
{
|
||||
name: 'Montserrat',
|
||||
data: await getTtfFont('Montserrat', ['ital', 'wght'], [0, 800]),
|
||||
weight: 800,
|
||||
style: 'normal',
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
function docSectionPath(slug: string, title: string) {
|
||||
let section = slug.split('/')[1].toString();
|
||||
|
||||
// Override some sections by slug
|
||||
switch (section) {
|
||||
case 'api':
|
||||
section = 'REST APIs';
|
||||
break;
|
||||
}
|
||||
|
||||
section = section.charAt(0).toUpperCase() + section.slice(1);
|
||||
|
||||
return `${title} / ${section}`;
|
||||
}
|
||||
|
||||
function pageSvg(permalink: string) {
|
||||
switch (permalink.slice(1, -1)) {
|
||||
case 'download':
|
||||
return downloadSvgElement;
|
||||
default:
|
||||
return homeSvgElement;
|
||||
}
|
||||
}
|
||||
|
||||
async function getTtfFont(family: string, axes: string[], value: number[]): Promise<ArrayBuffer> {
|
||||
const familyParam = axes.join(',') + '@' + value.join(',');
|
||||
|
||||
// Get css style sheet with user agent Mozilla/5.0 Firefox/1.0 to ensure TTF is returned
|
||||
const cssCall = await fetch(`https://fonts.googleapis.com/css2?family=${family}:${familyParam}&display=swap`, {
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 Firefox/1.0',
|
||||
},
|
||||
});
|
||||
|
||||
const css = await cssCall.text();
|
||||
const ttfUrl = css.match(/url\(([^)]+)\)/)?.[1];
|
||||
|
||||
return await fetch(ttfUrl).then(res => res.arrayBuffer());
|
||||
}
|
||||
|
||||
async function encodeRemoteImage(url: string): Promise<string> {
|
||||
try {
|
||||
const res = await fetch(url);
|
||||
const buffer = await res.arrayBuffer().then(buf => Buffer.from(buf));
|
||||
return `data:${res.headers.get('content-type')};base64,${buffer.toString('base64')}`;
|
||||
} catch (error) {
|
||||
return geyserLogoBase64;
|
||||
}
|
||||
}
|
||||
|
||||
function faSvg(icon: IconDefinition): ReactSVGElement {
|
||||
// create all path elements from icon.icon[4] contents (could be string or array of strings)
|
||||
const paths = typeof icon.icon[4] === 'string' ? [icon.icon[4]] : icon.icon[4];
|
||||
const svgPaths = paths.map((path: string) => React.createElement('path', { d: path, fill: '#e3e3e3' }));
|
||||
const viewBox = '0 0 ' + icon.icon[0] + ' ' + icon.icon[1];
|
||||
|
||||
const element = React.createElement('svg', {
|
||||
width: '50px',
|
||||
viewBox,
|
||||
style: { marginRight: 10 },
|
||||
}, ...svgPaths);
|
||||
|
||||
return element;
|
||||
}
|
||||
@@ -2,6 +2,8 @@
|
||||
// This file is not used in compilation. It is here just for a nice editor experience.
|
||||
"extends": "@docusaurus/tsconfig",
|
||||
"compilerOptions": {
|
||||
"lib": ["DOM", "DOM.Iterable", "ESNext"],
|
||||
"target": "ESNext",
|
||||
"baseUrl": "."
|
||||
},
|
||||
"exclude": [
|
||||
|
||||
Reference in new issue
Block a user