react-intlayer
Version:
Easily internationalize i18n your React applications with type-safe multilingual content management.
88 lines (85 loc) • 3.03 kB
JavaScript
'use client';
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
const require_markdown_processor = require('./processor.cjs');
let react = require("react");
let react_jsx_runtime = require("react/jsx-runtime");
//#region src/markdown/MarkdownProvider.tsx
const MarkdownContext = (0, react.createContext)(void 0);
/**
* Returns the raw `MarkdownProvider` context value — the active
* `renderMarkdown` function plus any provider-level component overrides.
* Returns `undefined` when called outside a `<MarkdownProvider>`.
* Prefer `useMarkdownRenderer` for most use cases; use this hook only when
* you need direct access to the context object itself.
*/
const useMarkdownContext = () => (0, react.useContext)(MarkdownContext);
const mergeOptions = (baseOptions, options = {}, components = {}, wrapper) => {
return {
...baseOptions,
...options,
forceBlock: options.forceBlock ?? baseOptions.forceBlock,
forceInline: options.forceInline ?? baseOptions.forceInline,
preserveFrontmatter: options.preserveFrontmatter ?? baseOptions.preserveFrontmatter,
tagfilter: options.tagfilter ?? baseOptions.tagfilter,
wrapper: wrapper || baseOptions.wrapper,
forceWrapper: !!(wrapper || baseOptions.wrapper),
components: {
...baseOptions.components,
...components
}
};
};
/**
* Provider for the MarkdownRenderer component.
*
* It will provide the `renderMarkdown` function to the context, which can be used to render markdown.
*
* ```tsx
* const content = useIntlayer('app');
*
* return (
* <div>
* {content.markdown} // Will be rendered with the components and options provided to the MarkdownProvider
* </div>
* );
* ```
*
* @example
* ```tsx
* <MarkdownProvider components={{ h1: CustomHeading }}>
* <MarkdownRenderer>
* {markdownContent}
* </MarkdownRenderer>
* </MarkdownProvider>
* ```
*/
const MarkdownProvider = ({ children, components, wrapper, forceBlock, forceInline, preserveFrontmatter, tagfilter, renderMarkdown: customRenderFn }) => {
const baseOptions = {
components,
forceBlock,
forceInline,
wrapper,
forceWrapper: !!wrapper,
preserveFrontmatter,
tagfilter
};
const defaultRenderMarkdown = (markdown, options, components, wrapper) => {
return require_markdown_processor.compileMarkdown(markdown, mergeOptions(baseOptions, options, components, wrapper));
};
const customRenderMarkdownWrapper = (markdown, options, components, wrapper) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MarkdownContext.Provider, {
value: void 0,
children: customRenderFn?.(markdown, options, components, wrapper)
});
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MarkdownContext.Provider, {
value: {
components,
renderMarkdown: customRenderFn ? customRenderMarkdownWrapper : defaultRenderMarkdown
},
children
});
};
//#endregion
exports.MarkdownProvider = MarkdownProvider;
exports.useMarkdownContext = useMarkdownContext;
//# sourceMappingURL=MarkdownProvider.cjs.map