diff --git a/src/resolvers/md2html.ts b/src/resolvers/md2html.ts index 443dbae8..420c3690 100644 --- a/src/resolvers/md2html.ts +++ b/src/resolvers/md2html.ts @@ -10,14 +10,17 @@ import {LeadingPage, ResolveMd2HTMLResult, ResolverOptions, YfmToc} from '../mod import {ArgvService, PluginService, TocService} from '../services'; import { generateStaticMarkup, + getLinksWithContentExtersion, getVarsPerFile, getVarsPerRelativeFile, logger, + modifyValuesByKeys, transformToc, } from '../utils'; import {Lang, PROCESSING_FINISHED} from '../constants'; import {getAssetsPublicPath, getVCSMetadata} from '../services/metadata'; import {MarkdownItPluginCb} from '@diplodoc/transform/lib/plugins/typings'; +import {LINK_KEYS} from '@diplodoc/client/ssr'; export interface FileTransformOptions { path: string; @@ -115,12 +118,20 @@ function YamlFileTransformer(content: string): Object { }; } - const links = data?.links?.map((link) => - link.href ? {...link, href: link.href.replace(/.md$/gmu, '.html')} : link, - ); + if (Object.prototype.hasOwnProperty.call(data, 'blocks')) { + data = modifyValuesByKeys(data, LINK_KEYS, (link) => { + if (getLinksWithContentExtersion(link)) { + return link.replace(/.(md|yaml)$/gmu, '.html'); + } + }); + } else { + const links = data?.links?.map((link) => + link.href ? {...link, href: link.href.replace(/.md$/gmu, '.html')} : link, + ); - if (links) { - data.links = links; + if (links) { + data.links = links; + } } return { diff --git a/src/utils/markup.ts b/src/utils/markup.ts index 80d31607..b5087447 100644 --- a/src/utils/markup.ts +++ b/src/utils/markup.ts @@ -1,6 +1,6 @@ import {join} from 'path'; import {platform} from 'process'; -import {flatMapDeep, isArray, isObject, isString} from 'lodash'; +import {cloneDeepWith, every, flatMapDeep, isArray, isObject, isString} from 'lodash'; import {CUSTOM_STYLE, Platforms, RTL_LANGS} from '../constants'; import {LeadingPage, Resources, SinglePageResult, TextItems, VarsMetadata} from '../models'; @@ -188,6 +188,29 @@ export function findAllValuesByKeys(obj, keysToFind: string[]) { }); } +export function modifyValuesByKeys( + originalObj, + keysToFind: string[], + modifyFn: () => string | string[], +) { + function customizer(value, key) { + // Apply the modification function if the key matches and it's a string or an array of strings + if ( + keysToFind?.includes(key) && + (isString(value) || (isArray(value) && every(value, isString))) + ) { + return isArray(value) ? value.map(modifyFn) : modifyFn(value); + } + } + + // Clone the object deeply with a customizer function that modifies matching keys + return cloneDeepWith(originalObj, customizer); +} + +export function getLinksWithContentExtersion(link: string) { + return new RegExp(/^\S.*\.(md|ya?ml|html)$/gm).test(link); +} + export function getLinksWithExtension(link: string) { const oneLineWithExtension = new RegExp( /^\S.*\.(md|html|yaml|svg|png|gif|jpg|jpeg|bmp|webp|ico)$/gm,