Skip to content

Commit

Permalink
feat: additional yfm plugins in contentTransformer (#551)
Browse files Browse the repository at this point in the history
* feat: ability to add external plugins for contentTransformer function
  • Loading branch information
Kyzyl-ool authored Sep 18, 2023
1 parent f95a76f commit 7799a59
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 9 deletions.
21 changes: 18 additions & 3 deletions src/text-transform/common.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
import defaultPlugins from '@doc-tools/transform/lib/plugins';
import {MarkdownItPluginCb} from '@doc-tools/transform/lib/plugins/typings';

import {Lang} from '../utils/configure';

import {fullTransform, typografToHTML} from './utils';

export type ComplexItem = {[key: string]: string};
export type Item = string | null | ComplexItem;
export type Transformer = (text: string) => string;
export type TransformerRaw = (lang: Lang, content: string) => string;
export type TransformerRaw = (
lang: Lang,
content: string,
options: {plugins: MarkdownItPluginCb[]},
) => string;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export type Parser<T = any> = (transformer: Transformer, block: T) => T;

Expand All @@ -30,8 +37,16 @@ export const createItemsParser = (fields: string[]) => (transformer: Transformer
}
});

export function yfmTransformer(lang: Lang, content: string) {
const {html} = fullTransform(content, {lang});
export function yfmTransformer(
lang: Lang,
content: string,
options: {plugins?: MarkdownItPluginCb[]} = {},
) {
const {plugins = []} = options;
const {html} = fullTransform(content, {
lang,
plugins: [...defaultPlugins, ...plugins],
});

return html;
}
Expand Down
29 changes: 23 additions & 6 deletions src/text-transform/transformers.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/* eslint-disable no-param-reassign */
/* eslint-disable no-not-accumulator-reassign/no-not-accumulator-reassign */
import {MarkdownItPluginCb} from '@doc-tools/transform/lib/plugins/typings';
import _ from 'lodash';

import {ConstructorBlock, PageContent} from '../models/constructor';
Expand All @@ -18,18 +19,30 @@ export type ContentTransformerProps = {
lang: Lang;
customConfig?: {};
vars?: ContentVariables;
plugins?: MarkdownItPluginCb[];
};
};

function transformBlocks(blocks: ConstructorBlock[], lang: Lang, customConfig = {}) {
function transformBlocks(
blocks: ConstructorBlock[],
lang: Lang,
customConfig = {},
options: {plugins?: MarkdownItPluginCb[]} = {},
) {
const fullConfig = {...config, ...customConfig};
const {plugins = []} = options;

const clonedBlocks = _.cloneDeep(blocks);

return clonedBlocks.map((block) => transformBlock(lang, fullConfig, block));
return clonedBlocks.map((block) => transformBlock(lang, fullConfig, block, plugins));
}

function transformBlock(lang: Lang, blocksConfig: BlocksConfig, block: ConstructorBlock) {
function transformBlock(
lang: Lang,
blocksConfig: BlocksConfig,
block: ConstructorBlock,
plugins: MarkdownItPluginCb[],
) {
const blockConfig = blocksConfig[block.type];

if (block) {
Expand All @@ -43,7 +56,9 @@ function transformBlock(lang: Lang, blocksConfig: BlocksConfig, block: Construct

configs.forEach((transformConfig) => {
const {fields, transformer: transformerRaw, parser} = transformConfig;
const transformer: Transformer = transformerRaw.bind(null, lang);
const transformer: Transformer = (content) =>
// eslint-disable-next-line no-useless-call
transformerRaw.call(null, lang, content, {plugins});

if (fields) {
(fields as (keyof typeof block)[]).forEach((field) => {
Expand All @@ -69,12 +84,14 @@ function transformBlock(lang: Lang, blocksConfig: BlocksConfig, block: Construct
}

export const contentTransformer = ({content, options}: ContentTransformerProps) => {
const {lang, customConfig = {}, vars} = options;
const {lang, customConfig = {}, vars, plugins = []} = options;
const {blocks = []} = (
vars ? filterContent(content as FilterableContent, vars) : content
) as PageContent;

const transformedBlocks = transformBlocks(blocks, lang, customConfig);
const transformedBlocks = transformBlocks(blocks, lang, customConfig, {
plugins,
});

return {
blocks: transformedBlocks,
Expand Down

0 comments on commit 7799a59

Please sign in to comment.