Skip to content

Commit 1d164e5

Browse files
authored
Merge pull request #375 from Krakazybik/feature-og-plugin-conf
PROMO-251: Connect OpenGraph plugin to Docusaurus [part2; split of PR-368]
2 parents e32e477 + c24ed12 commit 1d164e5

19 files changed

+98
-31
lines changed

Diff for: website/.eslintrc.js

+6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ module.exports = {
2323
},
2424
],
2525
"linebreak-style": [2, "unix"],
26+
"import/no-unresolved": [
27+
2,
28+
{
29+
ignore: ["^@theme-original"],
30+
},
31+
],
2632
},
2733
settings: {
2834
"import/resolver": {

Diff for: website/config/og/basic/RobotoMono-Bold.ttf

85 KB
Binary file not shown.

Diff for: website/config/og/basic/RobotoMono-Regular.ttf

84.9 KB
Binary file not shown.

Diff for: website/config/og/basic/preview.png

23.2 KB
Loading

Diff for: website/config/og/basic/template.json

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"image": "preview.png",
3+
"font": "RobotoMono-Bold.ttf",
4+
"layout": [
5+
{
6+
"name": "title",
7+
"top": 400,
8+
"left": 210
9+
}
10+
]
11+
}

Diff for: website/config/og/config.json

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"outputDir": "assets/og",
3+
"textWidthLimit": 1100,
4+
"quality": 70,
5+
"rules": [
6+
{
7+
"name": "basic",
8+
"priority": 0,
9+
"pattern": "."
10+
}
11+
]
12+
}

Diff for: website/docusaurus.config.js

+12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require("dotenv").config();
2+
const path = require("path");
23
const { REDIRECTS, SECTIONS, LEGACY_ROUTES } = require("./routes.config");
34

45
const DOMAIN = "https://feature-sliced.design/";
@@ -10,6 +11,13 @@ const TWITTER = "https://twitter.com/feature_sliced";
1011
const OPEN_COLLECTIVE = "https://opencollective.com/feature-sliced";
1112
const DEFAULT_LOCALE = "ru";
1213

14+
const DOCUSAURUS_PLUGIN_OG = [
15+
path.resolve(__dirname, "./plugins/docusaurus-plugin-og"),
16+
{
17+
templatesDir: path.resolve(__dirname, "config/og"),
18+
},
19+
];
20+
1321
/** @typedef {import('@docusaurus/types').DocusaurusConfig} Config */
1422

1523
/** @type {Config["themeConfig"]["navbar"]} */
@@ -254,6 +262,8 @@ const plugins = [
254262
},
255263
],
256264
process.env.HOTJAR_ID && "docusaurus-plugin-hotjar", // For preventing crashing
265+
// FIXME: Docusaurus Open Graph Plugin Experimental.
266+
process.env.OG_EXP && DOCUSAURUS_PLUGIN_OG,
257267
].filter(Boolean);
258268

259269
/** @type {Config["themeConfig"]["algolia"]} */
@@ -313,6 +323,8 @@ const metadatas = [
313323
*/
314324
const customFields = {
315325
legacyRoutes: LEGACY_ROUTES,
326+
// FIXME: Open Graph Experimental Mode.
327+
isOGExperimental: process.env.OG_EXP,
316328
};
317329

318330
/** @type {Config} */

Diff for: website/plugins/docusaurus-plugin-open-graph-image/config.js renamed to website/plugins/docusaurus-plugin-og/config.js

+1-7
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,7 @@ const Config = object({
3232
});
3333

3434
function validateConfig(config) {
35-
if (is(config, Config)) {
36-
return config.rules.reduce((validationResult, rule) => {
37-
if (!is(rule, Rule)) return false;
38-
return validationResult;
39-
}, true);
40-
}
41-
return false;
35+
return is(config, Config);
4236
}
4337

4438
module.exports = { getConfig };

Diff for: website/plugins/docusaurus-plugin-open-graph-image/font.js renamed to website/plugins/docusaurus-plugin-og/font.js

+6-8
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,12 @@ function createSVGText(
2222
) {
2323
const attributes = { fill, stroke };
2424
const options = { fontSize, anchor: "top", attributes };
25+
// Remove all emoji from text
26+
const filteredText = text.replace(
27+
/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g,
28+
"",
29+
);
2530

26-
/* If font width more than widthLimit => scale font width to ~90% of widthLimit */
27-
if (widthLimit) {
28-
const { width } = font.getMetrics(text, options);
29-
if (width > widthLimit)
30-
options.fontSize = Math.trunc((fontSize * 0.9) / (width / widthLimit));
31-
}
32-
33-
return font.getSVG(text, options);
31+
return font.getSVG(filteredText, options);
3432
}
3533
module.exports = { createSVGText, createFontsMapFromTemplates };

Diff for: website/plugins/docusaurus-plugin-open-graph-image/index.js renamed to website/plugins/docusaurus-plugin-og/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const { Logger } = require("./utils");
1111

1212
module.exports = function (_, { templatesDir }) {
1313
return {
14-
name: "docusaurus-plugin-open-graph-image",
14+
name: "docusaurus-plugin-og",
1515
async postBuild({ plugins, outDir, i18n }) {
1616
Logger.info(`OG: work in progress.`);
1717

Diff for: website/plugins/docusaurus-plugin-open-graph-image/template.js renamed to website/plugins/docusaurus-plugin-og/template.js

+6-15
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const { resolve } = require("path");
22
const { readdir, readFile } = require("fs/promises");
3-
const { object, string, number, array, is } = require("superstruct");
3+
const { object, string, number, array, is, optional } = require("superstruct");
44
const { objectFromBuffer, Logger } = require("./utils");
55

66
const dirIgnore = ["config.json"];
@@ -38,11 +38,11 @@ async function getTemplates(templatesDir, encode = "utf8") {
3838

3939
// TODO: May be with postEffects, images and etc? (optional fontSize, fill and etc)
4040
const Layout = object({
41-
type: string(),
41+
type: optional(string()),
4242
name: string(),
43-
fontSize: number(),
44-
fill: string(),
45-
stroke: string(),
43+
fontSize: optional(number()),
44+
fill: optional(string()),
45+
stroke: optional(string()),
4646
top: number(),
4747
left: number(),
4848
});
@@ -54,16 +54,7 @@ const Template = object({
5454
});
5555

5656
function validateTemplate({ params }) {
57-
if (is(params, Template)) {
58-
if (params.layout.length === 0) return false;
59-
60-
return params.layout.reduce((validationResult, layout) => {
61-
if (!is(layout, Layout)) return false;
62-
return validationResult;
63-
}, true);
64-
}
65-
66-
return false;
57+
return is(params, Template);
6758
}
6859

6960
module.exports = { getTemplates };

Diff for: website/src/shared/lib/og/index.js

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import React from "react";
2+
import Head from "@docusaurus/Head";
3+
4+
export function OGMeta({ imgUrl }) {
5+
return (
6+
<Head>
7+
<meta name="og:image" content={imgUrl} />
8+
<meta name="twitter:image" content={imgUrl} />
9+
</Head>
10+
);
11+
}

Diff for: website/src/theme/DocItem/index.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import React from "react";
2+
import OriginalDocItem from "@theme-original/DocItem";
3+
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
4+
import { OGMeta } from "@site/src/shared/lib/og";
5+
import { useDocOGUrl } from "./lib";
6+
7+
function DocItem(props) {
8+
const { content } = props;
9+
const { isOGExperimental } = useDocusaurusContext().siteConfig.customFields;
10+
const ogUrl = useDocOGUrl(content.metadata);
11+
12+
return (
13+
<>
14+
{isOGExperimental && <OGMeta imgUrl={ogUrl} />}
15+
<OriginalDocItem {...props} />
16+
</>
17+
);
18+
}
19+
20+
export default DocItem;

Diff for: website/src/theme/DocItem/lib/index.js

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import sha1 from "sha1";
2+
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
3+
4+
export function useDocOGUrl(metadata, buildOGPath = "assets/og/") {
5+
const { siteConfig, i18n } = useDocusaurusContext();
6+
const hashFileName = sha1(metadata.id + i18n.currentLocale);
7+
8+
/* OG Preview images build with locale prefix (.../en/assets/...) for not default locales */
9+
return `${siteConfig.url}${
10+
i18n.currentLocale !== i18n.defaultLocale ? `/${i18n.currentLocale}` : ""
11+
}/${buildOGPath}${hashFileName}.jpg`;
12+
}

0 commit comments

Comments
 (0)