nodoku-core 0.2.4 → 0.2.6
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/esm/bin/generate-component-resolver.js +15 -2
- package/esm/bin/manifest-loader.js +2 -1
- package/esm/bin/mustache/component-resolver.ts.hbs +23 -0
- package/esm/content/nd-content.js +8 -0
- package/esm/core/dummy-comp.jsx +58 -31
- package/esm/core/rendering-page-props.js +3 -1
- package/esm/core/rendering-page.jsx +12 -10
- package/esm/index.js +4 -4
- package/esm/providers/content/content-markdown-provider.js +59 -18
- package/esm/providers/skin/skin-yaml-provider.js +1 -0
- package/esm/skin/nd-skin.js +3 -1
- package/esm/tailwind/index.js +10 -0
- package/package.json +5 -1
- package/schemas/manifest-schema.json +6 -0
- package/tailwind/cjs/index.js +15 -0
- package/tailwind/types/index.d.ts +3 -0
- package/types/bin/manifest.d.ts +1 -0
- package/types/content/nd-content.d.ts +14 -4
- package/types/core/providers.d.ts +1 -0
- package/types/core/rendering-page-props.d.ts +3 -1
- package/types/index.d.ts +2 -2
- package/types/skin/nd-skin.d.ts +3 -1
- package/types/tailwind/index.d.ts +3 -0
|
@@ -17,7 +17,7 @@ function calculateTemplateView(dirNodeModules = undefined) {
|
|
|
17
17
|
dirNodeModules = `${path.resolve()}/node_modules`;
|
|
18
18
|
}
|
|
19
19
|
const manifests = loadManifestsFromFolder(dirNodeModules);
|
|
20
|
-
const view = { modules: [], comps: [] };
|
|
20
|
+
const view = { modules: [], comps: [], clSideComps: [] };
|
|
21
21
|
manifests.forEach((m, k) => {
|
|
22
22
|
let prefix = "";
|
|
23
23
|
if (m.namespace) {
|
|
@@ -35,9 +35,22 @@ function calculateTemplateView(dirNodeModules = undefined) {
|
|
|
35
35
|
else {
|
|
36
36
|
nb = `${cd.numBlocks}`;
|
|
37
37
|
}
|
|
38
|
-
view.comps.push({
|
|
38
|
+
view.comps.push({
|
|
39
|
+
name: cn,
|
|
40
|
+
impl: `${prefix}${cd.implementation}`,
|
|
41
|
+
defaultThemeFile: "./" + path.relative(path.resolve("."), path.resolve("./schemas", m.moduleName, cd.defaultThemeFile)).replaceAll("\\", "/"),
|
|
42
|
+
numBlocks: nb
|
|
43
|
+
});
|
|
44
|
+
if (cd.clientSideComps) {
|
|
45
|
+
cd.clientSideComps.forEach(cl => {
|
|
46
|
+
view.clSideComps.push({ n: `${cn}:${cl}`, isLast: false });
|
|
47
|
+
});
|
|
48
|
+
}
|
|
39
49
|
});
|
|
40
50
|
});
|
|
51
|
+
if (view.clSideComps && view.clSideComps.length > 0) {
|
|
52
|
+
view.clSideComps[view.clSideComps.length - 1].isLast = true;
|
|
53
|
+
}
|
|
41
54
|
return view;
|
|
42
55
|
}
|
|
43
56
|
export function generateComponentResolver() {
|
|
@@ -48,7 +48,8 @@ function loadComponentsByManifest(dir, moduleName) {
|
|
|
48
48
|
themeSchema: v.schemaFile,
|
|
49
49
|
optionsSchema: v.optionsFile,
|
|
50
50
|
defaultThemeFile: v.defaultThemeFile,
|
|
51
|
-
numBlocks: v.numBlocks
|
|
51
|
+
numBlocks: v.numBlocks,
|
|
52
|
+
clientSideComps: v.clientSideComps
|
|
52
53
|
});
|
|
53
54
|
});
|
|
54
55
|
return manifest;
|
|
@@ -10,6 +10,29 @@ const components: Map<string, {compo: AsyncFunctionComponent, compoDef: NdCompon
|
|
|
10
10
|
components.set("{{{name}}}", {compo: {{impl}}, compoDef: new NdComponentDefinition({{{numBlocks}}}, "{{{defaultThemeFile}}}")});
|
|
11
11
|
{{/comps}}
|
|
12
12
|
|
|
13
|
+
{{^clSideComps.length}}
|
|
14
|
+
export type ClientSideComponentNameEnum = void;
|
|
15
|
+
{{/clSideComps.length}}
|
|
16
|
+
|
|
17
|
+
{{#clSideComps.length}}
|
|
18
|
+
export type ClientSideComponentNameEnum =
|
|
19
|
+
{{#clSideComps.length}}
|
|
20
|
+
{{#clSideComps}}
|
|
21
|
+
"{{{n}}}"{{^isLast}} | {{/isLast}}{{#isLast}};{{/isLast}}
|
|
22
|
+
{{/clSideComps}}
|
|
23
|
+
{{/clSideComps.length}}
|
|
24
|
+
|
|
25
|
+
export const fromStringToClientSideComponentNameEnum = (c: string): ClientSideComponentNameEnum | undefined => {
|
|
26
|
+
{{#clSideComps}}
|
|
27
|
+
if (c === "{{{n}}}") {
|
|
28
|
+
return "{{{n}}}";
|
|
29
|
+
}
|
|
30
|
+
{{/clSideComps}}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
{{/clSideComps.length}}
|
|
35
|
+
|
|
13
36
|
export async function nodokuComponentResolver(componentName: string): Promise<{compo: AsyncFunctionComponent, compoDef: NdComponentDefinition}> {
|
|
14
37
|
const f: {compo: AsyncFunctionComponent, compoDef: NdComponentDefinition} | undefined = components.get(componentName);
|
|
15
38
|
return f ? f : {compo: DummyComp, compoDef: new NdComponentDefinition(1)};
|
package/esm/core/dummy-comp.jsx
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { NdCode, NdTranslatableText } from "../content/nd-content";
|
|
2
|
+
import { NdLink } from "../content/nd-content";
|
|
2
3
|
export async function DummyComp(props) {
|
|
3
4
|
// console.log("content dummy comp", props.theme)
|
|
4
5
|
const { content, i18nextTrustedHtmlProvider, lng, rowIndex, componentIndex } = props;
|
|
@@ -27,37 +28,7 @@ async function render(rowIndex, componentIndex, block, t) {
|
|
|
27
28
|
</h6>}
|
|
28
29
|
|
|
29
30
|
paragraphs:
|
|
30
|
-
{await Promise.all(block.paragraphs.map(async (p, ip) =>
|
|
31
|
-
if (p instanceof NdTranslatableText) {
|
|
32
|
-
return (<div>
|
|
33
|
-
{p && p.key}
|
|
34
|
-
<p key={ip} className={"mb-3 font-normal text-gray-700 dark:text-gray-400"}>
|
|
35
|
-
{p && t(p).__html}
|
|
36
|
-
</p>
|
|
37
|
-
</div>);
|
|
38
|
-
}
|
|
39
|
-
else if (p instanceof NdCode) {
|
|
40
|
-
const code = p;
|
|
41
|
-
return (<div className={"border border-gray-200 p-4"}>
|
|
42
|
-
<pre className={"text-pretty"}>
|
|
43
|
-
<code lang={code.lang} className={"hljs"} dangerouslySetInnerHTML={{ __html: code.code }}/>
|
|
44
|
-
</pre>
|
|
45
|
-
</div>);
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
const list = p;
|
|
49
|
-
if (list.ordered) {
|
|
50
|
-
return (<ol className={"list-disc list-outside"}>
|
|
51
|
-
{list.items.map(i => <li className={"ml-4"}>{t(i).__html} <small>(<i>{i.key}</i>)</small></li>)}
|
|
52
|
-
</ol>);
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
return (<ul className={"list-disc list-outside"}>
|
|
56
|
-
{list.items.map(i => <li className={"ml-4"}>{t(i).__html} <small>(<i>{i.key}</i>)</small></li>)}
|
|
57
|
-
</ul>);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}))}
|
|
31
|
+
{await Promise.all(block.paragraphs.map(async (p, ip) => renderParagraph(p, ip)))}
|
|
61
32
|
images:
|
|
62
33
|
{block.images.map((img, ii) => {
|
|
63
34
|
return (<div>
|
|
@@ -88,4 +59,60 @@ async function render(rowIndex, componentIndex, block, t) {
|
|
|
88
59
|
</div>
|
|
89
60
|
|
|
90
61
|
</div>);
|
|
62
|
+
function renderParagraph(p, ip) {
|
|
63
|
+
if (p instanceof NdTranslatableText) {
|
|
64
|
+
return (<div>
|
|
65
|
+
{p && p.key}
|
|
66
|
+
<p key={ip} className={"mb-3 font-normal text-gray-700 dark:text-gray-400"}>
|
|
67
|
+
{p && t(p).__html}
|
|
68
|
+
</p>
|
|
69
|
+
</div>);
|
|
70
|
+
}
|
|
71
|
+
else if (p instanceof NdCode) {
|
|
72
|
+
const code = p;
|
|
73
|
+
return (<div className={"border border-gray-200 p-4"}>
|
|
74
|
+
<pre className={"text-pretty"}>
|
|
75
|
+
<code lang={code.lang} className={"hljs"} dangerouslySetInnerHTML={{ __html: code.code }}/>
|
|
76
|
+
</pre>
|
|
77
|
+
</div>);
|
|
78
|
+
}
|
|
79
|
+
else if (p instanceof NdLink) {
|
|
80
|
+
const link = p;
|
|
81
|
+
return (<div>
|
|
82
|
+
link
|
|
83
|
+
<div key={ip} className={"mb-3 font-normal text-gray-700 dark:text-gray-400"}>
|
|
84
|
+
urlText: {link.urlText && showTranslatableText(link.urlText)}
|
|
85
|
+
url: {showTranslatableText(link.url)}
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
</div>);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
const list = p;
|
|
92
|
+
if (list.ordered) {
|
|
93
|
+
return (<ol className={"list-disc list-outside"}>
|
|
94
|
+
{list.items.map(i => <li className={"ml-4"}>
|
|
95
|
+
{showListItem(i)}
|
|
96
|
+
{i.subList && renderParagraph(i.subList, ip)}
|
|
97
|
+
</li>)}
|
|
98
|
+
</ol>);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
return (<ul className={"list-disc list-outside"}>
|
|
102
|
+
{list.items.map(i => <li className={"ml-4"}>
|
|
103
|
+
{showListItem(i)}
|
|
104
|
+
{i.subList && renderParagraph(i.subList, ip)}
|
|
105
|
+
</li>)}
|
|
106
|
+
</ul>);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function showTranslatableText(text) {
|
|
112
|
+
return <span>{text.text} <small>(<i>{text.key}</i>)</small></span>;
|
|
113
|
+
}
|
|
114
|
+
function showListItem(i) {
|
|
115
|
+
return i.text instanceof NdTranslatableText ?
|
|
116
|
+
showTranslatableText(i.text) :
|
|
117
|
+
<span>link item {(i.text.urlText ? showTranslatableText(i.text.urlText) : "link text n/a")} : {showTranslatableText(i.text.url)}</span>;
|
|
91
118
|
}
|
|
@@ -25,7 +25,8 @@ export class RenderingPageProps {
|
|
|
25
25
|
i18nextProvider = undefined;
|
|
26
26
|
i18nextPostProcessor;
|
|
27
27
|
htmlSanitizer;
|
|
28
|
-
|
|
28
|
+
clientSideComponentProvider;
|
|
29
|
+
constructor(lng, content, componentResolver, skin = undefined, renderingPriority = RenderingPriority.content_first, imageProvider = undefined, i18nextProvider = undefined, htmlSanitizer = undefined, clientSideComponentProvider = undefined) {
|
|
29
30
|
this.lng = lng;
|
|
30
31
|
this.renderingPriority = renderingPriority;
|
|
31
32
|
this.content = content;
|
|
@@ -34,5 +35,6 @@ export class RenderingPageProps {
|
|
|
34
35
|
this.imageProvider = imageProvider;
|
|
35
36
|
this.i18nextProvider = i18nextProvider;
|
|
36
37
|
this.htmlSanitizer = htmlSanitizer;
|
|
38
|
+
this.clientSideComponentProvider = clientSideComponentProvider;
|
|
37
39
|
}
|
|
38
40
|
}
|
|
@@ -16,7 +16,7 @@ async function defaultImageProvider(imageProps) {
|
|
|
16
16
|
return <img className={`${imageStyle?.base} ${imageStyle?.decoration}`} src={url} alt={alt}/>;
|
|
17
17
|
}
|
|
18
18
|
async function RenderingPage(props) {
|
|
19
|
-
const { lng, renderingPriority, content, componentResolver, skin, imageProvider, i18nextProvider, i18nextPostProcessor, htmlSanitizer } = props;
|
|
19
|
+
const { lng, renderingPriority, content, componentResolver, skin, imageProvider, i18nextProvider, i18nextPostProcessor, htmlSanitizer, clientSideComponentProvider } = props;
|
|
20
20
|
const actualComponentResolver = componentResolver ? componentResolver : defaultComponentResolver;
|
|
21
21
|
let l;
|
|
22
22
|
if (skin) {
|
|
@@ -26,10 +26,10 @@ async function RenderingPage(props) {
|
|
|
26
26
|
}
|
|
27
27
|
// console.log(" >>> this is my content <<< ", content)
|
|
28
28
|
// console.log(" >>> this is my skin <<< ", JSON.stringify(blockSkin))
|
|
29
|
-
l = await Promise.all(blockSkin.rows.map(async (row, iRow) => await createRow(row, iRow, content, lng, imageProvider, i18nextProvider, i18nextPostProcessor, actualComponentResolver, htmlSanitizer)));
|
|
29
|
+
l = await Promise.all(blockSkin.rows.map(async (row, iRow) => await createRow(row, iRow, content, lng, imageProvider, i18nextProvider, i18nextPostProcessor, actualComponentResolver, htmlSanitizer, clientSideComponentProvider)));
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
|
-
l = [await createRow(undefined, 0, content, lng, imageProvider, i18nextProvider, i18nextPostProcessor, actualComponentResolver, htmlSanitizer)];
|
|
32
|
+
l = [await createRow(undefined, 0, content, lng, imageProvider, i18nextProvider, i18nextPostProcessor, actualComponentResolver, htmlSanitizer, clientSideComponentProvider)];
|
|
33
33
|
}
|
|
34
34
|
const actualSkin = mergeTheme(skin, { renderingPage: { base: "", decoration: "" }, rows: [] });
|
|
35
35
|
return <div className={`rows-container ${ts(actualSkin, "renderingPage")}`}>{l}</div>;
|
|
@@ -66,13 +66,13 @@ function generateSkinByContentBlocks(blocks, skin) {
|
|
|
66
66
|
// console.log("generated skin", JSON.stringify(res))
|
|
67
67
|
return res;
|
|
68
68
|
}
|
|
69
|
-
async function createRow(row, iRow, blocks, lng, imageProvider, i18nProvider, i18nextPostProcessor, componentResolver, htmlSanitizer) {
|
|
69
|
+
async function createRow(row, iRow, blocks, lng, imageProvider, i18nProvider, i18nextPostProcessor, componentResolver, htmlSanitizer, clientSideComponentProvider) {
|
|
70
70
|
let l;
|
|
71
71
|
if (row) {
|
|
72
|
-
l = await Promise.all(row.components.map(async (visualSection, iComp) => await createRowComponents(iRow, iComp, visualSection, blocks, lng, imageProvider, i18nProvider, i18nextPostProcessor, componentResolver, htmlSanitizer)));
|
|
72
|
+
l = await Promise.all(row.components.map(async (visualSection, iComp) => await createRowComponents(iRow, iComp, visualSection, blocks, lng, imageProvider, i18nProvider, i18nextPostProcessor, componentResolver, htmlSanitizer, clientSideComponentProvider)));
|
|
73
73
|
}
|
|
74
74
|
else {
|
|
75
|
-
l = await Promise.all(blocks.map(async (block, iComp) => await createRowComponents(iRow, iComp, undefined, [block], lng, imageProvider, i18nProvider, i18nextPostProcessor, componentResolver, htmlSanitizer)));
|
|
75
|
+
l = await Promise.all(blocks.map(async (block, iComp) => await createRowComponents(iRow, iComp, undefined, [block], lng, imageProvider, i18nProvider, i18nextPostProcessor, componentResolver, htmlSanitizer, clientSideComponentProvider)));
|
|
76
76
|
}
|
|
77
77
|
const rowComponents = l.flatMap((p) => p);
|
|
78
78
|
if (rowComponents.length == 0) {
|
|
@@ -144,7 +144,7 @@ async function createRow(row, iRow, blocks, lng, imageProvider, i18nProvider, i1
|
|
|
144
144
|
</div>)}
|
|
145
145
|
</div>);
|
|
146
146
|
}
|
|
147
|
-
async function createRowComponents(rowIndex, blockIndex, skinComponent, pageContent, lng, imageProvider, i18nProvider, i18nextPostProcessor, componentResolver, htmlSanitizer) {
|
|
147
|
+
async function createRowComponents(rowIndex, blockIndex, skinComponent, pageContent, lng, imageProvider, i18nProvider, i18nextPostProcessor, componentResolver, htmlSanitizer, clientSideComponentProvider) {
|
|
148
148
|
// console.log("before component", skinComponent)
|
|
149
149
|
const filteredBlocks = skinComponent ? skinComponent.selector.filterBlocks(pageContent) : pageContent;
|
|
150
150
|
if (filteredBlocks.length == 0) {
|
|
@@ -170,7 +170,7 @@ async function createRowComponents(rowIndex, blockIndex, skinComponent, pageCont
|
|
|
170
170
|
const blocks = filteredBlocks.slice(start, end);
|
|
171
171
|
const compIndex = blockIndex * filteredBlocks.length + i;
|
|
172
172
|
// console.log("calculated compo index ", compIndex, "filteredBlocks.length", filteredBlocks.length, "blockIndex", blockIndex)
|
|
173
|
-
res.push(await renderSingleComponent(rowIndex, compIndex, compo, blocks, skinComponent?.defaultThemeName || "light", compoDef.defaultTheme, skinComponent?.themeHierarchy, lng, imageProvider, i18nProvider, i18nextPostProcessor, htmlSanitizer));
|
|
173
|
+
res.push(await renderSingleComponent(rowIndex, compIndex, compo, blocks, skinComponent?.defaultThemeName || "light", compoDef.defaultTheme, skinComponent?.themeHierarchy, lng, imageProvider, i18nProvider, i18nextPostProcessor, htmlSanitizer, clientSideComponentProvider));
|
|
174
174
|
}
|
|
175
175
|
start = end;
|
|
176
176
|
++i;
|
|
@@ -227,7 +227,7 @@ function makeTrusted(provider, sanitizer) {
|
|
|
227
227
|
return { t: tt };
|
|
228
228
|
};
|
|
229
229
|
}
|
|
230
|
-
async function renderSingleComponent(rowIndex, componentIndex, component, blocks, defaultThemeName, defaultTheme, themeHierarchy, lng, imageProvider, i18nextProvider, i18nextPostProcessor, htmlSanitizer) {
|
|
230
|
+
async function renderSingleComponent(rowIndex, componentIndex, component, blocks, defaultThemeName, defaultTheme, themeHierarchy, lng, imageProvider, i18nextProvider, i18nextPostProcessor, htmlSanitizer, clientSideComponentProvider) {
|
|
231
231
|
let actualI18nextProvider_;
|
|
232
232
|
if (lng == blocks[0].lng || !i18nextProvider) {
|
|
233
233
|
actualI18nextProvider_ = async (lng) => {
|
|
@@ -242,6 +242,7 @@ async function renderSingleComponent(rowIndex, componentIndex, component, blocks
|
|
|
242
242
|
}
|
|
243
243
|
const actualI18nextProvider = makeTrusted(wrapInPostProcessor(actualI18nextProvider_, i18nextPostProcessor), htmlSanitizer || ((text) => ({ __html: text })));
|
|
244
244
|
const actualImageProvider = imageProvider ? imageProvider : defaultImageProvider;
|
|
245
|
+
const actualClientSideComponentProvider = clientSideComponentProvider ? clientSideComponentProvider : (c) => <span>[placeholder for: {c}]</span>;
|
|
245
246
|
// if (themeHierarchy) {
|
|
246
247
|
// console.log("themeHierarchy", themeHierarchy)
|
|
247
248
|
// }
|
|
@@ -257,7 +258,8 @@ async function renderSingleComponent(rowIndex, componentIndex, component, blocks
|
|
|
257
258
|
options: effectiveOptions,
|
|
258
259
|
lng: lng,
|
|
259
260
|
imageProvider: actualImageProvider,
|
|
260
|
-
i18nextTrustedHtmlProvider: actualI18nextProvider
|
|
261
|
+
i18nextTrustedHtmlProvider: actualI18nextProvider,
|
|
262
|
+
clientSideComponentProvider: actualClientSideComponentProvider
|
|
261
263
|
};
|
|
262
264
|
// console.log("start rendering page with props", props);
|
|
263
265
|
const res = await component(props);
|
package/esm/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { NdContentImage, NdTranslatableText, NdList, NdCode, NdCallToAction, NdContentBlock } from "./content/nd-content";
|
|
1
|
+
import { NdContentImage, NdTranslatableText, NdList, NdLink, NdCode, NdCallToAction, NdContentBlock } from "./content/nd-content";
|
|
2
2
|
import { NdSkinComponent, NdRow, NdPageSkin, NdSkinComponentProps, NdContentSelector, NdComponentDefinition, NdThemeHierarchy } from "./skin/nd-skin";
|
|
3
3
|
import { RenderingPageProps, RenderingPriority } from "./core/rendering-page-props";
|
|
4
4
|
import { RenderingPage } from "./core/rendering-page";
|
|
5
5
|
import { mergeTheme } from "./theme-utils/theme-merger";
|
|
6
6
|
import { defaultRowThemeImpl } from "./theme-utils/row-style";
|
|
7
|
-
export { NdContentImage, NdTranslatableText, NdList, NdCode, NdCallToAction, NdContentBlock, NdSkinComponent, NdRow, NdPageSkin, NdSkinComponentProps, NdContentSelector, NdComponentDefinition, NdThemeHierarchy };
|
|
7
|
+
export { NdContentImage, NdTranslatableText, NdList, NdLink, NdCode, NdCallToAction, NdContentBlock, NdSkinComponent, NdRow, NdPageSkin, NdSkinComponentProps, NdContentSelector, NdComponentDefinition, NdThemeHierarchy };
|
|
8
8
|
export { RenderingPageProps, RenderingPriority, RenderingPage };
|
|
9
9
|
export { mergeTheme };
|
|
10
10
|
export { DummyComp } from "./core/dummy-comp";
|
|
@@ -23,14 +23,14 @@ export const tsi = function (t, key, i) {
|
|
|
23
23
|
const obj = t[key];
|
|
24
24
|
const themeStyle = obj[i % len];
|
|
25
25
|
const k = key;
|
|
26
|
-
return k + `[${i}]` + themeStyle?.base + " " + themeStyle?.decoration;
|
|
26
|
+
return k + `[${i}] ` + themeStyle?.base + " " + themeStyle?.decoration;
|
|
27
27
|
}
|
|
28
28
|
else if (Array.isArray(t[key])) {
|
|
29
29
|
// console.log("this is tsi array", key)
|
|
30
30
|
const len = t[key].length;
|
|
31
31
|
const themeStyle = t[key][i % len];
|
|
32
32
|
const k = key;
|
|
33
|
-
return k + `[${i}]` + themeStyle?.base + " " + themeStyle?.decoration;
|
|
33
|
+
return k + `[${i}] ` + themeStyle?.base + " " + themeStyle?.decoration;
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
36
|
return ts(t, key);
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { NdTranslatableText, NdList, NdContentBlock, NdContentImage, NdCode } from "nodoku-core";
|
|
2
2
|
import { Marked } from '@ts-stack/markdown';
|
|
3
|
-
import { parse } from 'node-html-parser';
|
|
3
|
+
import { parse, TextNode } from 'node-html-parser';
|
|
4
4
|
import yaml from "js-yaml";
|
|
5
5
|
import { NdCallToAction } from "../../content/nd-content";
|
|
6
|
+
import { NdLink } from "../../content/nd-content";
|
|
6
7
|
const nsRegex = /.*\/(.*)\.md/;
|
|
7
8
|
export async function contentMarkdownProvider(mdFileUrl, contentLng, ns = undefined) {
|
|
8
9
|
return await fetch(mdFileUrl)
|
|
@@ -203,7 +204,7 @@ class BlockHolder {
|
|
|
203
204
|
text = newBlock.h6;
|
|
204
205
|
}
|
|
205
206
|
else if (this.blockContent.paragraphsIndex.indexOf(i) >= 0) {
|
|
206
|
-
const para = this.parseParagraph(blockId
|
|
207
|
+
const para = this.parseParagraph(`${blockId}.paragraphs.${pi}`, htmlElem);
|
|
207
208
|
if (para) {
|
|
208
209
|
newBlock.paragraphs.push(para);
|
|
209
210
|
text = para;
|
|
@@ -285,9 +286,23 @@ class BlockHolder {
|
|
|
285
286
|
// console.log("returnin created cta: ", cta)
|
|
286
287
|
return cta;
|
|
287
288
|
}
|
|
288
|
-
parseParagraph(
|
|
289
|
+
parseParagraph(idPrefix, cn) {
|
|
290
|
+
if (!cn) {
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
if (cn instanceof TextNode) {
|
|
294
|
+
return new NdTranslatableText(this.ns, `${idPrefix}`, cn.text);
|
|
295
|
+
}
|
|
296
|
+
const p = cn;
|
|
297
|
+
if (!p.rawTagName) {
|
|
298
|
+
return undefined;
|
|
299
|
+
}
|
|
300
|
+
// console.log("parsing paragraph", p.innerHTML);
|
|
289
301
|
if (p.rawTagName === "p" || p.rawTagName === "blockquote") {
|
|
290
|
-
return new NdTranslatableText(this.ns, `${
|
|
302
|
+
return new NdTranslatableText(this.ns, `${idPrefix}`, p.innerHTML);
|
|
303
|
+
}
|
|
304
|
+
else if (p.rawTagName === "a") {
|
|
305
|
+
return new NdLink(new NdTranslatableText(this.ns, `${idPrefix}.urlText`, p.innerHTML), new NdTranslatableText(this.ns, `${idPrefix}.url`, p.attributes["href"], true));
|
|
291
306
|
}
|
|
292
307
|
else if (p.rawTagName === "pre") {
|
|
293
308
|
const codeHtml = p.childNodes[0];
|
|
@@ -301,24 +316,50 @@ class BlockHolder {
|
|
|
301
316
|
}
|
|
302
317
|
}
|
|
303
318
|
else if (p.rawTagName === "ol") {
|
|
304
|
-
return NdList.createOrdered(p
|
|
305
|
-
.filter(lin => lin.innerText && lin.innerText.trim().length > 0)
|
|
306
|
-
.map((lin, k) => {
|
|
307
|
-
const li = lin;
|
|
308
|
-
return new NdTranslatableText(this.ns, `${blockId}.paragraphs.${pi}.items.${k}`, li.innerHTML);
|
|
309
|
-
}));
|
|
319
|
+
return NdList.createOrdered(this.parseListItems(idPrefix, p));
|
|
310
320
|
}
|
|
311
321
|
else if (p.rawTagName === "ul") {
|
|
312
|
-
return NdList.createUnOrdered(p
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
}));
|
|
318
|
-
}
|
|
319
|
-
console.log("couldn't parse paragraph: ", p);
|
|
322
|
+
return NdList.createUnOrdered(this.parseListItems(idPrefix, p));
|
|
323
|
+
} /*else {
|
|
324
|
+
return new NdTranslatableText(this.ns, `${idPrefix}`, p.innerHTML);
|
|
325
|
+
}*/
|
|
326
|
+
console.log("couldn't parse paragraph: ", p.innerHTML);
|
|
320
327
|
return undefined;
|
|
321
328
|
}
|
|
329
|
+
parseListItems(idPrefix, p) {
|
|
330
|
+
return p.childNodes
|
|
331
|
+
.filter(lin => lin.innerText && lin.innerText.trim().length > 0)
|
|
332
|
+
.map((lin, k) => {
|
|
333
|
+
const li = lin;
|
|
334
|
+
let innerList = undefined;
|
|
335
|
+
let liText; //TextNode | undefined;
|
|
336
|
+
if (li.childNodes.length > 0) {
|
|
337
|
+
// console.log("found inner item", li.childNodes.length, (li.childNodes.map(i => i as HTMLElement)
|
|
338
|
+
// .map((i1: HTMLElement) => i1.rawTagName ? i1.rawTagName : "N.A")), "<<<");
|
|
339
|
+
//
|
|
340
|
+
// console.log("found inner list", li.childNodes[0].innerText)
|
|
341
|
+
innerList = li.childNodes
|
|
342
|
+
.map(cn => this.parseParagraph(`${idPrefix}.items.${k}.subList`, cn))
|
|
343
|
+
.find((p) => p != undefined && p instanceof NdList);
|
|
344
|
+
liText = li.childNodes
|
|
345
|
+
.map(cn => this.parseParagraph(`${idPrefix}.items.${k}.text`, cn))
|
|
346
|
+
.find((p) => p != undefined && (p instanceof NdLink || p instanceof NdTranslatableText));
|
|
347
|
+
// innerList = innerNodes.find((p: NdParagraph | undefined) => p != undefined && p instanceof NdList)
|
|
348
|
+
// if (li.childNodes[0].rawTagName in ["ol", "ul"]) {
|
|
349
|
+
// }
|
|
350
|
+
// liText = li.childNodes.filter(cn => cn instanceof TextNode).find(t => t && t.text.length > 0);
|
|
351
|
+
// liText = innerNodes.find((p: NdParagraph | undefined) => p != undefined && (p instanceof NdLink || p instanceof NdTranslatableText))
|
|
352
|
+
}
|
|
353
|
+
// type l = keyof HTMLElement
|
|
354
|
+
// console.log("found list", li.childNodes.filter(cn => Object.keys(cn).map(k => k == "parentNode" ? "parent" : (cn as HTMLElement)[k as l])), "<<", lin.innerText, "<<")
|
|
355
|
+
// const foundList = {text: new NdTranslatableText(this.ns, `${idPrefix}.items.${k}`, liText)/*liText*/, subList: innerList};
|
|
356
|
+
const foundList = { text: liText ? liText : new NdTranslatableText(this.ns, `${idPrefix}.items.${k}`, "n/a"), subList: innerList };
|
|
357
|
+
// console.log("found list", ">>", foundList, "<<")
|
|
358
|
+
return foundList;
|
|
359
|
+
// const listItem = this.parseParagraph(`${idPrefix}.items.${k}`, li)
|
|
360
|
+
// return listItem ? listItem : new NdTranslatableText(this.ns, `${idPrefix}.items.${k}`, "undefined list item" + li.innerHTML);
|
|
361
|
+
}).filter(lin => lin != undefined);
|
|
362
|
+
}
|
|
322
363
|
}
|
|
323
364
|
export function parseMarkdownAsContent(fileContents, contentLng, ns) {
|
|
324
365
|
Marked.setOptions({ isNoP: true });
|
|
@@ -40,6 +40,7 @@ export function parseYamlContentAsSkin(fileContents) {
|
|
|
40
40
|
lbVisualComponent.themeHierarchy.componentThemes = componentTheme ? componentTheme[vcName]?.themes?.slice() : undefined;
|
|
41
41
|
lbVisualComponent.themeHierarchy.theme = vb.theme;
|
|
42
42
|
lbVisualComponent.themeHierarchy.themes = vb.themes?.slice();
|
|
43
|
+
lbVisualComponent.themeHierarchy.options = vb.options;
|
|
43
44
|
lbVisualComponent.componentName = vcName;
|
|
44
45
|
const attributes = vb.selector.attributes ?
|
|
45
46
|
Object.keys(vb.selector.attributes).map(a => { return { key: a, value: vb.selector.attributes[a] }; }) :
|
package/esm/skin/nd-skin.js
CHANGED
|
@@ -119,7 +119,8 @@ export class NdSkinComponentProps {
|
|
|
119
119
|
lng;
|
|
120
120
|
imageProvider;
|
|
121
121
|
i18nextTrustedHtmlProvider;
|
|
122
|
-
|
|
122
|
+
clientSideComponentProvider;
|
|
123
|
+
constructor(rowIndex, componentIndex, content, defaultThemeName, theme, themes, options, lng, imageProvider, i18nextTrustedHtmlProvider, clientSideComponentProvider) {
|
|
123
124
|
this.rowIndex = rowIndex;
|
|
124
125
|
this.componentIndex = componentIndex;
|
|
125
126
|
this.content = content;
|
|
@@ -130,5 +131,6 @@ export class NdSkinComponentProps {
|
|
|
130
131
|
this.lng = lng;
|
|
131
132
|
this.imageProvider = imageProvider;
|
|
132
133
|
this.i18nextTrustedHtmlProvider = i18nextTrustedHtmlProvider;
|
|
134
|
+
this.clientSideComponentProvider = clientSideComponentProvider;
|
|
133
135
|
}
|
|
134
136
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export var NodokuCoreTailwind;
|
|
2
|
+
(function (NodokuCoreTailwind) {
|
|
3
|
+
function tailwindConfig(nodeModules = "./node_modules") {
|
|
4
|
+
return [
|
|
5
|
+
`./${nodeModules}/nodoku-core/esm/**/*.js`,
|
|
6
|
+
`./${nodeModules}/nodoku-core/esm/**/*.jsx`,
|
|
7
|
+
];
|
|
8
|
+
}
|
|
9
|
+
NodokuCoreTailwind.tailwindConfig = tailwindConfig;
|
|
10
|
+
})(NodokuCoreTailwind || (NodokuCoreTailwind = {}));
|
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nodoku-core",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"description": "basic foundation for nodoku static site generator",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
7
7
|
"types": "./types/index.d.ts",
|
|
8
8
|
"import": "./esm/index.js"
|
|
9
9
|
},
|
|
10
|
+
"./tailwind": {
|
|
11
|
+
"types": "./types/tailwind/index.d.ts",
|
|
12
|
+
"require": "./esm/tailwind/index.js"
|
|
13
|
+
},
|
|
10
14
|
"./package.json": "./package.json"
|
|
11
15
|
},
|
|
12
16
|
"module": "esm/index.js",
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NodokuCoreTailwind = void 0;
|
|
4
|
+
var NodokuCoreTailwind;
|
|
5
|
+
(function (NodokuCoreTailwind) {
|
|
6
|
+
function tailwindConfig(nodeModules) {
|
|
7
|
+
if (nodeModules === void 0) { nodeModules = "./node_modules"; }
|
|
8
|
+
return [
|
|
9
|
+
"./".concat(nodeModules, "/nodoku-core/esm/**/*.js"),
|
|
10
|
+
"./".concat(nodeModules, "/nodoku-core/esm/**/*.jsx"),
|
|
11
|
+
];
|
|
12
|
+
}
|
|
13
|
+
NodokuCoreTailwind.tailwindConfig = tailwindConfig;
|
|
14
|
+
})(NodokuCoreTailwind || (exports.NodokuCoreTailwind = NodokuCoreTailwind = {}));
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFpbHdpbmQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBaUIsa0JBQWtCLENBUWxDO0FBUkQsV0FBaUIsa0JBQWtCO0lBQy9CLFNBQWdCLGNBQWMsQ0FBQyxXQUFzQztRQUF0Qyw0QkFBQSxFQUFBLDhCQUFzQztRQUNqRSxPQUFPO1lBQ0gsWUFBSyxXQUFXLDZCQUEwQjtZQUMxQyxZQUFLLFdBQVcsOEJBQTJCO1NBQzlDLENBQUE7SUFDTCxDQUFDO0lBTGUsaUNBQWMsaUJBSzdCLENBQUE7QUFFTCxDQUFDLEVBUmdCLGtCQUFrQixrQ0FBbEIsa0JBQWtCLFFBUWxDIn0=
|
package/types/bin/manifest.d.ts
CHANGED
|
@@ -15,18 +15,28 @@ export declare class NdTranslatableText {
|
|
|
15
15
|
excludeFromTranslation: boolean;
|
|
16
16
|
constructor(ns: string, key?: string, text?: string, excludeFromTranslation?: boolean);
|
|
17
17
|
}
|
|
18
|
+
export type NdListItem = {
|
|
19
|
+
text: NdTranslatableText | NdLink;
|
|
20
|
+
subList: NdParagraph | undefined;
|
|
21
|
+
};
|
|
18
22
|
export declare class NdList {
|
|
19
|
-
items:
|
|
23
|
+
items: NdListItem[];
|
|
20
24
|
ordered: boolean;
|
|
21
25
|
private constructor();
|
|
22
|
-
static createOrdered(items:
|
|
23
|
-
static createUnOrdered(items:
|
|
26
|
+
static createOrdered(items: NdListItem[]): NdList;
|
|
27
|
+
static createUnOrdered(items: NdListItem[]): NdList;
|
|
24
28
|
}
|
|
25
29
|
export declare class NdCode {
|
|
26
30
|
lang: string;
|
|
27
31
|
code: string;
|
|
28
32
|
constructor(lang: string, code: string);
|
|
29
33
|
}
|
|
34
|
+
export declare class NdLink {
|
|
35
|
+
urlText: NdTranslatableText | undefined;
|
|
36
|
+
url: NdTranslatableText;
|
|
37
|
+
constructor(text: NdTranslatableText, url: NdTranslatableText);
|
|
38
|
+
}
|
|
39
|
+
export type NdParagraph = NdTranslatableText | NdList | NdCode | NdLink;
|
|
30
40
|
export declare class NdContentBlock {
|
|
31
41
|
id: string;
|
|
32
42
|
lng: string;
|
|
@@ -43,7 +53,7 @@ export declare class NdContentBlock {
|
|
|
43
53
|
h5?: NdTranslatableText;
|
|
44
54
|
h6?: NdTranslatableText;
|
|
45
55
|
callToActions: NdCallToAction[];
|
|
46
|
-
paragraphs:
|
|
56
|
+
paragraphs: NdParagraph[];
|
|
47
57
|
images: NdContentImage[];
|
|
48
58
|
htmlElements: {
|
|
49
59
|
htmlElem: HTMLElement;
|
|
@@ -25,3 +25,4 @@ export type NdI18nextTrustedHtmlProvider = (lng: string) => Promise<{
|
|
|
25
25
|
export type NdImageProvider = (imageProps: NdImageProps) => Promise<JSX.Element>;
|
|
26
26
|
export type NdI18NextPostProcessor = (text: string) => string;
|
|
27
27
|
export type NdHtmlSanitizer = (text: string) => NdTrustedHtml;
|
|
28
|
+
export type NdClientSideComponentProvider = (componentName: string) => JSX.Element;
|
|
@@ -3,6 +3,7 @@ import { NdContentBlock } from "../content/nd-content";
|
|
|
3
3
|
import { NdPageSkin } from "../skin/nd-skin";
|
|
4
4
|
import { NdI18NextPostProcessor } from "./providers";
|
|
5
5
|
import { NdHtmlSanitizer } from "./providers";
|
|
6
|
+
import { NdClientSideComponentProvider } from "./providers";
|
|
6
7
|
export declare enum RenderingPriority {
|
|
7
8
|
content_first = 0,
|
|
8
9
|
skin_first = 1
|
|
@@ -17,5 +18,6 @@ export declare class RenderingPageProps {
|
|
|
17
18
|
i18nextProvider: NdI18nextProvider | undefined;
|
|
18
19
|
i18nextPostProcessor: NdI18NextPostProcessor | undefined;
|
|
19
20
|
htmlSanitizer: NdHtmlSanitizer | undefined;
|
|
20
|
-
|
|
21
|
+
clientSideComponentProvider: NdClientSideComponentProvider | undefined;
|
|
22
|
+
constructor(lng: string, content: NdContentBlock[], componentResolver: ComponentResolver | undefined, skin?: NdPageSkin | undefined, renderingPriority?: RenderingPriority, imageProvider?: NdImageProvider | undefined, i18nextProvider?: NdI18nextProvider | undefined, htmlSanitizer?: NdHtmlSanitizer | undefined, clientSideComponentProvider?: NdClientSideComponentProvider | undefined);
|
|
21
23
|
}
|
package/types/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NdContentImage, NdTranslatableText, NdList, NdCode, NdCallToAction, NdContentBlock } from "./content/nd-content";
|
|
1
|
+
import { NdContentImage, NdTranslatableText, NdList, NdLink, NdListItem, NdCode, NdCallToAction, NdParagraph, NdContentBlock } from "./content/nd-content";
|
|
2
2
|
import { NdSkinComponent, NdRow, NdPageSkin, NdSkinComponentProps, NdContentSelector, NdComponentDefinition, NdThemeHierarchy, NdDefaultThemeName } from "./skin/nd-skin";
|
|
3
3
|
import { RenderingPageProps, RenderingPriority } from "./core/rendering-page-props";
|
|
4
4
|
import { RenderingPage } from "./core/rendering-page";
|
|
@@ -8,7 +8,7 @@ import { ThemeStyle } from "./theme-utils/theme-style";
|
|
|
8
8
|
import { ExtendedThemeStyle } from "./theme-utils/extended-theme-style";
|
|
9
9
|
import { ImageStyle } from "./theme-utils/image-style";
|
|
10
10
|
import { RowStyle } from "./theme-utils/row-style";
|
|
11
|
-
export { NdContentImage, NdTranslatableText, NdList, NdCode, NdCallToAction, NdContentBlock, NdSkinComponent, NdRow, NdPageSkin, NdSkinComponentProps, NdContentSelector, NdComponentDefinition, NdThemeHierarchy, type NdDefaultThemeName, type NdImageProps, type NdI18nextTrustedHtmlProvider, type NdHtmlSanitizer, type NdTrustedHtml, type NdI18NextPostProcessor };
|
|
11
|
+
export { NdContentImage, NdTranslatableText, NdList, type NdListItem, NdLink, NdCode, NdCallToAction, NdContentBlock, NdSkinComponent, NdRow, NdPageSkin, NdSkinComponentProps, NdContentSelector, NdComponentDefinition, NdThemeHierarchy, type NdParagraph, type NdDefaultThemeName, type NdImageProps, type NdI18nextTrustedHtmlProvider, type NdHtmlSanitizer, type NdTrustedHtml, type NdI18NextPostProcessor };
|
|
12
12
|
export { RenderingPageProps, RenderingPriority, RenderingPage };
|
|
13
13
|
export { mergeTheme, type ThemeStyle, type ExtendedThemeStyle, type ImageStyle };
|
|
14
14
|
export type { NdI18nextProvider, AsyncFunctionComponent, NdImageProvider };
|
package/types/skin/nd-skin.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { NdContentBlock } from "../content/nd-content";
|
|
|
3
3
|
import { ThemeStyle } from "../theme-utils/theme-style";
|
|
4
4
|
import { RowStyle } from "../theme-utils/row-style";
|
|
5
5
|
import { NdI18nextTrustedHtmlProvider } from "../core/providers";
|
|
6
|
+
import { NdClientSideComponentProvider } from "../core/providers";
|
|
6
7
|
export type NdDefaultThemeName = "light" | "dark";
|
|
7
8
|
export declare class NdThemeHierarchy {
|
|
8
9
|
defaultThemeName: NdDefaultThemeName;
|
|
@@ -72,5 +73,6 @@ export declare class NdSkinComponentProps<TComponentTheme = any, TComponentOptio
|
|
|
72
73
|
lng: string;
|
|
73
74
|
imageProvider: NdImageProvider;
|
|
74
75
|
i18nextTrustedHtmlProvider: NdI18nextTrustedHtmlProvider;
|
|
75
|
-
|
|
76
|
+
clientSideComponentProvider: NdClientSideComponentProvider;
|
|
77
|
+
constructor(rowIndex: number, componentIndex: number, content: NdContentBlock[], defaultThemeName: NdDefaultThemeName, theme: TComponentTheme, themes: TComponentTheme[], options: TComponentOptions, lng: string, imageProvider: NdImageProvider, i18nextTrustedHtmlProvider: NdI18nextTrustedHtmlProvider, clientSideComponentProvider: NdClientSideComponentProvider);
|
|
76
78
|
}
|