@brillout/docpress 0.15.10 → 0.15.11-commit-e615832
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Layout.tsx +3 -0
- package/autoScrollNav.ts +3 -3
- package/code-blocks/components/CodeSnippets.css +74 -0
- package/code-blocks/components/CodeSnippets.tsx +51 -0
- package/code-blocks/components/Pre.css +51 -0
- package/code-blocks/components/Pre.tsx +70 -0
- package/code-blocks/hooks/useMDXComponents.tsx +13 -0
- package/code-blocks/hooks/useSelectCodeLang.ts +74 -0
- package/code-blocks/rehypeMetaToProps.ts +69 -0
- package/code-blocks/remarkDetype.ts +192 -0
- package/code-blocks/shikiTransformerAutoLinks.ts +61 -0
- package/css/button.css +23 -0
- package/css/code.css +3 -21
- package/css/tooltip.css +10 -2
- package/dist/+config.js +1 -1
- package/dist/NavItemComponent.js +38 -46
- package/dist/code-blocks/rehypeMetaToProps.d.ts +35 -0
- package/dist/code-blocks/rehypeMetaToProps.js +62 -0
- package/dist/code-blocks/remarkDetype.d.ts +4 -0
- package/dist/code-blocks/remarkDetype.js +164 -0
- package/dist/code-blocks/shikiTransformerAutoLinks.d.ts +8 -0
- package/dist/code-blocks/shikiTransformerAutoLinks.js +51 -0
- package/dist/components/CodeBlockTransformer.js +2 -3
- package/dist/components/Comment.js +1 -2
- package/dist/components/FileRemoved.js +4 -6
- package/dist/components/HorizontalLine.js +1 -2
- package/dist/components/ImportMeta.js +2 -3
- package/dist/components/Link.js +34 -50
- package/dist/components/Note.js +17 -29
- package/dist/components/P.js +1 -12
- package/dist/components/RepoLink.js +7 -9
- package/dist/determineNavItemsColumnLayout.js +48 -63
- package/dist/parseMarkdownMini.js +5 -17
- package/dist/parsePageSections.js +41 -82
- package/dist/renderer/usePageContext.js +6 -7
- package/dist/resolvePageContext.js +103 -110
- package/dist/utils/Emoji/Emoji.js +13 -21
- package/dist/utils/assert.js +14 -16
- package/dist/utils/cls.js +1 -1
- package/dist/utils/determineSectionUrlHash.js +5 -5
- package/dist/utils/filter.js +2 -2
- package/dist/utils/getGlobalObject.js +3 -3
- package/dist/vite.config.js +17 -7
- package/index.ts +16 -14
- package/package.json +7 -2
- package/resolvePageContext.ts +19 -15
- package/tsconfig.json +2 -1
- package/vite.config.ts +14 -4
|
@@ -1,66 +1,26 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
12
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
-
function step(op) {
|
|
15
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
-
switch (op[0]) {
|
|
20
|
-
case 0: case 1: t = op; break;
|
|
21
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
-
default:
|
|
25
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
-
if (t[2]) _.ops.pop();
|
|
30
|
-
_.trys.pop(); continue;
|
|
31
|
-
}
|
|
32
|
-
op = body.call(thisArg, _);
|
|
33
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
1
|
export { parsePageSections };
|
|
38
2
|
import { assert } from './utils/assert.js';
|
|
39
3
|
import { determineSectionUrlHash } from './utils/determineSectionUrlHash.js';
|
|
40
4
|
import os from 'os';
|
|
41
5
|
function parsePageSections() {
|
|
42
|
-
var _this = this;
|
|
43
6
|
return {
|
|
44
7
|
name: '@brillout/docpress:parsePageSections',
|
|
45
8
|
enforce: 'pre',
|
|
46
|
-
transform:
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return [2 /*return*/, codeNew];
|
|
54
|
-
});
|
|
55
|
-
}); },
|
|
9
|
+
transform: async (code, id) => {
|
|
10
|
+
if (!id.endsWith('+Page.mdx')) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const codeNew = transform(code);
|
|
14
|
+
return codeNew;
|
|
15
|
+
},
|
|
56
16
|
};
|
|
57
17
|
}
|
|
58
18
|
function transform(code) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
19
|
+
const pageSections = [];
|
|
20
|
+
let isCodeBlock = false;
|
|
21
|
+
let codeNew = code
|
|
62
22
|
.split('\n')
|
|
63
|
-
.map(
|
|
23
|
+
.map((line) => {
|
|
64
24
|
// Skip code blocks, e.g.
|
|
65
25
|
// ~~~md
|
|
66
26
|
// # Markdown Example
|
|
@@ -78,51 +38,50 @@ function transform(code) {
|
|
|
78
38
|
|| line.startsWith('<h2')
|
|
79
39
|
*/
|
|
80
40
|
) {
|
|
81
|
-
|
|
82
|
-
pageSections.push({ pageSectionId
|
|
41
|
+
const { pageSectionId, pageSectionLevel, pageSectionTitle, headingHtml } = parsePageSection(line);
|
|
42
|
+
pageSections.push({ pageSectionId, pageSectionLevel, pageSectionTitle });
|
|
83
43
|
return headingHtml;
|
|
84
44
|
}
|
|
85
45
|
return line;
|
|
86
46
|
})
|
|
87
47
|
.join('\n');
|
|
88
|
-
|
|
89
|
-
.map(
|
|
90
|
-
.join(', ')
|
|
91
|
-
codeNew +=
|
|
48
|
+
const exportCode = `export const pageSectionsExport = [${pageSections
|
|
49
|
+
.map((pageSection) => JSON.stringify(pageSection))
|
|
50
|
+
.join(', ')}];`;
|
|
51
|
+
codeNew += `\n\n${exportCode}\n`;
|
|
92
52
|
return codeNew;
|
|
93
53
|
}
|
|
94
54
|
function parsePageSection(line) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
assert(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
var anchor = titleMdx;
|
|
55
|
+
const [lineBegin, ...lineWords] = line.split(' ');
|
|
56
|
+
assert(lineBegin.split('#').join('') === '', { line, lineWords });
|
|
57
|
+
const pageSectionLevel = lineBegin.length;
|
|
58
|
+
const titleMdx = lineWords.join(' ');
|
|
59
|
+
assert(!titleMdx.startsWith(' '), { line, lineWords });
|
|
60
|
+
assert(titleMdx, { line, lineWords });
|
|
61
|
+
let pageSectionTitle = titleMdx;
|
|
62
|
+
let anchor = titleMdx;
|
|
104
63
|
{
|
|
105
64
|
// Support custom anchor: `## Some Title{#custom-anchor}`
|
|
106
|
-
|
|
65
|
+
const customAnchor = /(?<={#).*(?=})/g.exec(titleMdx)?.[0];
|
|
107
66
|
if (customAnchor) {
|
|
108
67
|
anchor = customAnchor;
|
|
109
68
|
pageSectionTitle = titleMdx.replace(/{#.*}/g, '');
|
|
110
69
|
}
|
|
111
70
|
}
|
|
112
|
-
|
|
113
|
-
|
|
71
|
+
const pageSectionId = determineSectionUrlHash(anchor);
|
|
72
|
+
const titleParsed = parseMarkdownMini(pageSectionTitle);
|
|
114
73
|
assert(pageSectionId === null || pageSectionId.length > 0);
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
74
|
+
const headingId = pageSectionId === null ? '' : ` id="${pageSectionId}"`;
|
|
75
|
+
const headingHtml = `<h${pageSectionLevel}${headingId}>${titleParsed}</h${pageSectionLevel}>`;
|
|
76
|
+
const pageSection = { pageSectionLevel, pageSectionTitle, pageSectionId, headingHtml };
|
|
118
77
|
return pageSection;
|
|
119
78
|
}
|
|
120
79
|
function parseMarkdownMini(titleMarkdown) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
titleMarkdown.split('').forEach(
|
|
80
|
+
const parts = [];
|
|
81
|
+
let current;
|
|
82
|
+
titleMarkdown.split('').forEach((letter) => {
|
|
124
83
|
if (letter === '`') {
|
|
125
|
-
if (
|
|
84
|
+
if (current?.nodeType === 'code') {
|
|
126
85
|
// </code>
|
|
127
86
|
parts.push(current);
|
|
128
87
|
current = undefined;
|
|
@@ -145,25 +104,25 @@ function parseMarkdownMini(titleMarkdown) {
|
|
|
145
104
|
if (current) {
|
|
146
105
|
parts.push(current);
|
|
147
106
|
}
|
|
148
|
-
|
|
149
|
-
.map(
|
|
107
|
+
const titleHtml = parts
|
|
108
|
+
.map((part) => {
|
|
150
109
|
if (part.nodeType === 'code') {
|
|
151
|
-
return
|
|
110
|
+
return `<code>${serializeText(part.content)}</code>`;
|
|
152
111
|
}
|
|
153
112
|
else {
|
|
154
|
-
assert(part.nodeType === 'text', { parts
|
|
113
|
+
assert(part.nodeType === 'text', { parts });
|
|
155
114
|
return serializeText(part.content);
|
|
156
115
|
}
|
|
157
116
|
})
|
|
158
117
|
.join('');
|
|
159
118
|
return titleHtml;
|
|
160
119
|
function serializeText(text) {
|
|
161
|
-
|
|
120
|
+
let textEscaped = text.split("'").join("\\'");
|
|
162
121
|
// https://github.com/brillout/docpress/pull/2
|
|
163
122
|
if (isWindows()) {
|
|
164
123
|
textEscaped = textEscaped.replace(/\r/, '');
|
|
165
124
|
}
|
|
166
|
-
return
|
|
125
|
+
return `{'${textEscaped}'}`;
|
|
167
126
|
}
|
|
168
127
|
}
|
|
169
128
|
function isWindows() {
|
|
@@ -3,20 +3,19 @@ export { usePageContext };
|
|
|
3
3
|
export { usePageContextLegacy };
|
|
4
4
|
import React, { useContext } from 'react';
|
|
5
5
|
import { getGlobalObject } from '../utils/getGlobalObject';
|
|
6
|
-
|
|
6
|
+
const globalObject = getGlobalObject('usePageContext.ts', {
|
|
7
7
|
Ctx: React.createContext(undefined),
|
|
8
8
|
});
|
|
9
9
|
function usePageContextLegacy() {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
const { Ctx } = globalObject;
|
|
11
|
+
const pageContext = useContext(Ctx);
|
|
12
12
|
return pageContext.resolved;
|
|
13
13
|
}
|
|
14
14
|
function usePageContext() {
|
|
15
|
-
|
|
15
|
+
const pageContext = useContext(globalObject.Ctx);
|
|
16
16
|
return pageContext;
|
|
17
17
|
}
|
|
18
|
-
function PageContextProvider(
|
|
19
|
-
|
|
20
|
-
var Ctx = globalObject.Ctx;
|
|
18
|
+
function PageContextProvider({ pageContext, children, }) {
|
|
19
|
+
const { Ctx } = globalObject;
|
|
21
20
|
return React.createElement(Ctx.Provider, { value: pageContext }, children);
|
|
22
21
|
}
|
|
@@ -1,75 +1,57 @@
|
|
|
1
|
-
var __assign = (this && this.__assign) || function () {
|
|
2
|
-
__assign = Object.assign || function(t) {
|
|
3
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
-
s = arguments[i];
|
|
5
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
-
t[p] = s[p];
|
|
7
|
-
}
|
|
8
|
-
return t;
|
|
9
|
-
};
|
|
10
|
-
return __assign.apply(this, arguments);
|
|
11
|
-
};
|
|
12
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
13
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
14
|
-
if (ar || !(i in from)) {
|
|
15
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
16
|
-
ar[i] = from[i];
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
20
|
-
};
|
|
21
1
|
export { resolvePageContext };
|
|
22
|
-
import { assert } from './utils/assert';
|
|
2
|
+
import { assert, assertUsage } from './utils/assert';
|
|
23
3
|
import { jsxToTextContent } from './utils/jsxToTextContent';
|
|
24
4
|
import pc from '@brillout/picocolors';
|
|
25
5
|
import { parseMarkdownMini } from './parseMarkdownMini';
|
|
26
6
|
import { determineNavItemsColumnLayout } from './determineNavItemsColumnLayout';
|
|
27
7
|
function resolvePageContext(pageContext) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
var pageSections = (_a = pageContext.config.pageSectionsExport) !== null && _a !== void 0 ? _a : [];
|
|
8
|
+
const config = pageContext.globalContext.config.docpress;
|
|
9
|
+
const { urlPathname } = pageContext;
|
|
10
|
+
const pageSections = pageContext.config.pageSectionsExport ?? [];
|
|
32
11
|
{
|
|
33
|
-
|
|
34
|
-
assertHeadingsDefinition(
|
|
12
|
+
const { headings, headingsDetached } = config;
|
|
13
|
+
assertHeadingsDefinition([...headings, ...headingsDetached]);
|
|
35
14
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
15
|
+
const ret = getHeadingsResolved(config);
|
|
16
|
+
const { headingsDetachedResolved } = ret;
|
|
17
|
+
let { headingsResolved } = ret;
|
|
18
|
+
const { activeHeading, isDetachedPage, activeCategoryName } = getActiveHeading(headingsResolved, headingsDetachedResolved, urlPathname);
|
|
19
|
+
const { documentTitle, isLandingPage, pageTitle } = getTitles(activeHeading, urlPathname, config);
|
|
20
|
+
const pageSectionsResolved = getPageSectionsResolved(pageSections, activeHeading);
|
|
21
|
+
const linksGlobal = [
|
|
22
|
+
...headingsResolved.map(headingToLinkData),
|
|
23
|
+
...headingsDetachedResolved.map(headingToLinkData),
|
|
24
|
+
];
|
|
25
|
+
const linksPage = pageSectionsResolved.map(pageSectionToLinkData);
|
|
26
|
+
const linksAll = [...linksPage, ...linksGlobal];
|
|
27
|
+
let navItemsAll;
|
|
28
|
+
let navItemsDetached;
|
|
47
29
|
{
|
|
48
|
-
|
|
49
|
-
.filter(
|
|
30
|
+
const navItemsPageSections = pageSectionsResolved
|
|
31
|
+
.filter((pageSection) => pageSection.pageSectionLevel === 2)
|
|
50
32
|
.map(pageSectionToNavItem);
|
|
51
33
|
navItemsAll = headingsResolved.map(headingToNavItem);
|
|
52
34
|
determineNavItemsColumnLayout(navItemsAll);
|
|
53
35
|
if (isDetachedPage) {
|
|
54
|
-
navItemsDetached =
|
|
36
|
+
navItemsDetached = [headingToNavItem(activeHeading), ...navItemsPageSections];
|
|
55
37
|
}
|
|
56
38
|
else {
|
|
57
|
-
|
|
58
|
-
assert(
|
|
59
|
-
navItemsPageSections.forEach(
|
|
60
|
-
navItemsAll.splice(
|
|
39
|
+
const activeHeadingIndex = navItemsAll.findIndex((navItem) => navItem.url === urlPathname);
|
|
40
|
+
assert(activeHeadingIndex >= 0);
|
|
41
|
+
navItemsPageSections.forEach((navItem, i) => {
|
|
42
|
+
navItemsAll.splice(activeHeadingIndex + 1 + i, 0, navItem);
|
|
61
43
|
});
|
|
62
44
|
}
|
|
63
45
|
}
|
|
64
|
-
|
|
65
|
-
navItemsAll
|
|
66
|
-
navItemsDetached
|
|
46
|
+
const resolved = {
|
|
47
|
+
navItemsAll,
|
|
48
|
+
navItemsDetached,
|
|
67
49
|
pageDesign: activeHeading.pageDesign,
|
|
68
|
-
linksAll
|
|
69
|
-
isLandingPage
|
|
70
|
-
pageTitle
|
|
71
|
-
documentTitle
|
|
72
|
-
activeCategoryName
|
|
50
|
+
linksAll,
|
|
51
|
+
isLandingPage,
|
|
52
|
+
pageTitle,
|
|
53
|
+
documentTitle,
|
|
54
|
+
activeCategoryName,
|
|
73
55
|
};
|
|
74
56
|
return resolved;
|
|
75
57
|
}
|
|
@@ -109,106 +91,117 @@ function pageSectionToLinkData(pageSection) {
|
|
|
109
91
|
};
|
|
110
92
|
}
|
|
111
93
|
function getTitles(activeHeading, urlPathname, config) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
94
|
+
const isLandingPage = urlPathname === '/';
|
|
95
|
+
const { title } = activeHeading;
|
|
96
|
+
let pageTitle = isLandingPage ? null : title;
|
|
97
|
+
let documentTitle = activeHeading.titleDocument || jsxToTextContent(parseMarkdownMini(title));
|
|
116
98
|
if (!isLandingPage) {
|
|
117
99
|
documentTitle += ' | ' + config.name;
|
|
118
100
|
}
|
|
119
101
|
if (isLandingPage) {
|
|
120
102
|
pageTitle = null;
|
|
121
103
|
}
|
|
122
|
-
return { documentTitle
|
|
104
|
+
return { documentTitle, isLandingPage, pageTitle };
|
|
123
105
|
}
|
|
124
106
|
function getActiveHeading(headingsResolved, headingsDetachedResolved, urlPathname) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
107
|
+
const URLs = '\n' +
|
|
108
|
+
[...headingsResolved, ...headingsDetachedResolved]
|
|
109
|
+
.filter(Boolean)
|
|
110
|
+
.map((h) => h.url)
|
|
111
|
+
.sort()
|
|
112
|
+
.map((url) => ` ${url}`)
|
|
113
|
+
.join('\n');
|
|
114
|
+
const errNotFound = `URL ${pc.bold(urlPathname)} not found in following URLs:${URLs}`;
|
|
115
|
+
const errFoundTwice = `URL ${pc.bold(urlPathname)} found twice in following URLs:${URLs}`;
|
|
116
|
+
let activeHeading = null;
|
|
117
|
+
let activeCategoryName = 'Miscellaneous';
|
|
118
|
+
let headingCategory;
|
|
129
119
|
assert(urlPathname);
|
|
130
|
-
for (
|
|
131
|
-
var heading = headingsResolved_1[_i];
|
|
120
|
+
for (const heading of headingsResolved) {
|
|
132
121
|
if (heading.level === 1) {
|
|
133
122
|
headingCategory = heading.title;
|
|
134
123
|
}
|
|
135
124
|
if (heading.url === urlPathname) {
|
|
125
|
+
assertUsage(!activeHeading, errFoundTwice);
|
|
136
126
|
activeHeading = heading;
|
|
137
127
|
assert(headingCategory);
|
|
138
128
|
activeCategoryName = headingCategory;
|
|
139
|
-
assert(heading.level === 2, { pageUrl: urlPathname, heading
|
|
129
|
+
assert(heading.level === 2, { pageUrl: urlPathname, heading });
|
|
140
130
|
break;
|
|
141
131
|
}
|
|
142
132
|
}
|
|
143
|
-
|
|
144
|
-
if (!activeHeading) {
|
|
145
|
-
activeHeading = (_a = headingsDetachedResolved.find(function (_a) {
|
|
146
|
-
var url = _a.url;
|
|
147
|
-
return urlPathname === url;
|
|
148
|
-
})) !== null && _a !== void 0 ? _a : null;
|
|
149
|
-
}
|
|
133
|
+
const isDetachedPage = !activeHeading;
|
|
150
134
|
if (!activeHeading) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
.join('\n'),
|
|
158
|
-
].join('\n'));
|
|
135
|
+
const found = headingsDetachedResolved.filter(({ url }) => urlPathname === url);
|
|
136
|
+
if (found.length > 0) {
|
|
137
|
+
assertUsage(found.length === 1, errFoundTwice);
|
|
138
|
+
assertUsage(!activeHeading, errFoundTwice);
|
|
139
|
+
activeHeading = found[0];
|
|
140
|
+
}
|
|
159
141
|
}
|
|
142
|
+
assertUsage(activeHeading, errNotFound);
|
|
160
143
|
if (activeHeading.category)
|
|
161
144
|
activeCategoryName = activeHeading.category;
|
|
162
|
-
return { activeHeading
|
|
145
|
+
return { activeHeading, isDetachedPage, activeCategoryName };
|
|
163
146
|
}
|
|
164
147
|
function getPageSectionsResolved(pageSections, activeHeading) {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
url: url,
|
|
148
|
+
const pageSectionsResolved = pageSections.map((pageSection) => {
|
|
149
|
+
const { pageSectionTitle } = pageSection;
|
|
150
|
+
const url = pageSection.pageSectionId === null ? null : '#' + pageSection.pageSectionId;
|
|
151
|
+
const pageSectionResolved = {
|
|
152
|
+
url,
|
|
171
153
|
title: pageSectionTitle,
|
|
172
|
-
linkBreadcrumb:
|
|
154
|
+
linkBreadcrumb: [activeHeading.title, ...(activeHeading.linkBreadcrumb ?? [])],
|
|
173
155
|
titleInNav: pageSectionTitle,
|
|
174
156
|
pageSectionLevel: pageSection.pageSectionLevel,
|
|
175
157
|
};
|
|
176
158
|
return pageSectionResolved;
|
|
177
159
|
});
|
|
178
|
-
if (activeHeading
|
|
179
|
-
activeHeading.sectionTitles.forEach(
|
|
180
|
-
|
|
181
|
-
assert(pageSectionTitles.includes(sectionTitle), { pageHeadingTitles: pageSectionTitles, sectionTitle
|
|
160
|
+
if (activeHeading?.sectionTitles) {
|
|
161
|
+
activeHeading.sectionTitles.forEach((sectionTitle) => {
|
|
162
|
+
const pageSectionTitles = pageSections.map((h) => h.pageSectionTitle);
|
|
163
|
+
assert(pageSectionTitles.includes(sectionTitle), { pageHeadingTitles: pageSectionTitles, sectionTitle });
|
|
182
164
|
});
|
|
183
165
|
}
|
|
184
166
|
return pageSectionsResolved;
|
|
185
167
|
}
|
|
186
168
|
function getHeadingsResolved(config) {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
169
|
+
const headingsWithoutBreadcrumb = config.headings.map((heading) => {
|
|
170
|
+
const titleInNav = heading.titleInNav || heading.title;
|
|
171
|
+
const headingResolved = {
|
|
172
|
+
...heading,
|
|
173
|
+
titleInNav,
|
|
174
|
+
};
|
|
190
175
|
return headingResolved;
|
|
191
176
|
});
|
|
192
|
-
|
|
193
|
-
headingsWithoutBreadcrumb.forEach(
|
|
194
|
-
|
|
195
|
-
headingsResolved.push(
|
|
177
|
+
const headingsResolved = [];
|
|
178
|
+
headingsWithoutBreadcrumb.forEach((heading) => {
|
|
179
|
+
const linkBreadcrumb = getHeadingsBreadcrumb(heading, headingsResolved);
|
|
180
|
+
headingsResolved.push({
|
|
181
|
+
...heading,
|
|
182
|
+
linkBreadcrumb,
|
|
183
|
+
});
|
|
196
184
|
});
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
assert(headingsResolved.find(
|
|
200
|
-
return
|
|
185
|
+
const headingsDetachedResolved = config.headingsDetached.map((headingsDetached) => {
|
|
186
|
+
const { url } = headingsDetached;
|
|
187
|
+
assert(headingsResolved.find((heading) => heading.url === url) === undefined, `remove ${headingsDetached.url} from headingsDetached`);
|
|
188
|
+
return {
|
|
189
|
+
...headingsDetached,
|
|
190
|
+
level: 2,
|
|
191
|
+
titleInNav: headingsDetached.title,
|
|
192
|
+
linkBreadcrumb: null,
|
|
193
|
+
};
|
|
201
194
|
});
|
|
202
|
-
return { headingsResolved
|
|
195
|
+
return { headingsResolved, headingsDetachedResolved };
|
|
203
196
|
}
|
|
204
197
|
function getHeadingsBreadcrumb(heading, headings) {
|
|
205
|
-
|
|
206
|
-
|
|
198
|
+
const linkBreadcrumb = [];
|
|
199
|
+
let levelCurrent = heading.level;
|
|
207
200
|
headings
|
|
208
201
|
.slice()
|
|
209
202
|
.reverse()
|
|
210
|
-
.forEach(
|
|
211
|
-
|
|
203
|
+
.forEach((parentCandidate) => {
|
|
204
|
+
const isParent = parentCandidate.level < levelCurrent;
|
|
212
205
|
if (isParent) {
|
|
213
206
|
levelCurrent = parentCandidate.level;
|
|
214
207
|
linkBreadcrumb.push(parentCandidate.title);
|
|
@@ -217,9 +210,9 @@ function getHeadingsBreadcrumb(heading, headings) {
|
|
|
217
210
|
return linkBreadcrumb;
|
|
218
211
|
}
|
|
219
212
|
function assertHeadingsDefinition(headings) {
|
|
220
|
-
headings.forEach(
|
|
213
|
+
headings.forEach((heading) => {
|
|
221
214
|
if (heading.url) {
|
|
222
|
-
|
|
215
|
+
const { url } = heading;
|
|
223
216
|
assert(url.startsWith('/'));
|
|
224
217
|
}
|
|
225
218
|
});
|
|
@@ -1,22 +1,10 @@
|
|
|
1
1
|
// Let's eventually remove this. Telefunc is still using this as of 2024-12.
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
2
|
import React from 'react';
|
|
14
3
|
import { assert } from '../assert';
|
|
15
4
|
import { iconMechanicalArm, iconShield, iconTypescript, iconEngine } from './assets';
|
|
16
5
|
export { Emoji };
|
|
17
|
-
function Emoji(
|
|
18
|
-
|
|
19
|
-
var emoji =
|
|
6
|
+
function Emoji({ name, style }) {
|
|
7
|
+
const emoji =
|
|
20
8
|
// ***
|
|
21
9
|
// U+26A0
|
|
22
10
|
// https://emojipedia.org/warning/
|
|
@@ -165,22 +153,26 @@ function Emoji(_a) {
|
|
|
165
153
|
(name === 'left-right-arrow' && Unicode(0xFE0F)) ||
|
|
166
154
|
(name === 'left-right-arrow' && Unicode(0xFE0F, { fontFamily: 'reset' })) ||
|
|
167
155
|
======================== */
|
|
168
|
-
assert(emoji, { name
|
|
156
|
+
assert(emoji, { name });
|
|
169
157
|
return emoji;
|
|
170
158
|
function Unicode(codePoint, styleAddendum) {
|
|
171
|
-
|
|
159
|
+
const text = String.fromCodePoint(codePoint);
|
|
172
160
|
if (style || styleAddendum) {
|
|
173
|
-
return React.createElement('span', { style:
|
|
161
|
+
return React.createElement('span', { style: { ...style, ...styleAddendum } }, text);
|
|
174
162
|
}
|
|
175
163
|
else {
|
|
176
164
|
return React.createElement(React.Fragment, null, text);
|
|
177
165
|
}
|
|
178
166
|
}
|
|
179
|
-
function Img(imgSrc, width) {
|
|
180
|
-
|
|
181
|
-
var props = {
|
|
167
|
+
function Img(imgSrc, width = '1.15em') {
|
|
168
|
+
const props = {
|
|
182
169
|
src: imgSrc,
|
|
183
|
-
style:
|
|
170
|
+
style: {
|
|
171
|
+
verticalAlign: 'text-top',
|
|
172
|
+
fontSize: '1em',
|
|
173
|
+
width,
|
|
174
|
+
...style,
|
|
175
|
+
},
|
|
184
176
|
};
|
|
185
177
|
return React.createElement('img', props);
|
|
186
178
|
}
|