@diplodoc/cli 5.23.1 → 5.24.1
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/build/index.js +3 -3
- package/build/index.mjs +3 -3
- package/lib/markdown/index.js +29 -5
- package/lib/markdown/index.js.map +2 -2
- package/lib/markdown/index.mjs +29 -5
- package/lib/markdown/index.mjs.map +2 -2
- package/package.json +2 -2
package/build/index.js
CHANGED
|
@@ -346428,7 +346428,7 @@ var import_config75 = require("@diplodoc/cli/lib/config");
|
|
|
346428
346428
|
|
|
346429
346429
|
// src/constants.ts
|
|
346430
346430
|
var import_node_path2 = require("node:path");
|
|
346431
|
-
var VERSION = "5.
|
|
346431
|
+
var VERSION = "5.24.1" ? "5.24.1" : "0.0.0";
|
|
346432
346432
|
var MAIN_TIMER_ID = "Build time";
|
|
346433
346433
|
var ASSETS_FOLDER = (0, import_node_path2.resolve)(__dirname, "../assets");
|
|
346434
346434
|
var BUNDLE_FOLDER = "_bundle";
|
|
@@ -390263,8 +390263,8 @@ var run2 = async (argv2) => {
|
|
|
390263
390263
|
if (import_node_worker_threads4.isMainThread && require.main === module) {
|
|
390264
390264
|
(async () => {
|
|
390265
390265
|
import_utils384.console.time(MAIN_TIMER_ID);
|
|
390266
|
-
if ("5.
|
|
390267
|
-
import_utils384.console.log(`Using v${"5.
|
|
390266
|
+
if ("5.24.1") {
|
|
390267
|
+
import_utils384.console.log(`Using v${"5.24.1"} version`);
|
|
390268
390268
|
}
|
|
390269
390269
|
const report = await run2(process.argv);
|
|
390270
390270
|
import_utils384.console.timeEnd(MAIN_TIMER_ID);
|
package/build/index.mjs
CHANGED
|
@@ -346415,7 +346415,7 @@ import { Command as Command7 } from "@diplodoc/cli/lib/config";
|
|
|
346415
346415
|
|
|
346416
346416
|
// src/constants.ts
|
|
346417
346417
|
import { join, resolve as resolve2 } from "node:path";
|
|
346418
|
-
var VERSION = "5.
|
|
346418
|
+
var VERSION = "5.24.1" ? "5.24.1" : "0.0.0";
|
|
346419
346419
|
var MAIN_TIMER_ID = "Build time";
|
|
346420
346420
|
var ASSETS_FOLDER = resolve2(__dirname, "../assets");
|
|
346421
346421
|
var BUNDLE_FOLDER = "_bundle";
|
|
@@ -390283,8 +390283,8 @@ var run2 = async (argv2) => {
|
|
|
390283
390283
|
if (isMainThread4 && __require.main === module) {
|
|
390284
390284
|
(async () => {
|
|
390285
390285
|
console5.time(MAIN_TIMER_ID);
|
|
390286
|
-
if ("5.
|
|
390287
|
-
console5.log(`Using v${"5.
|
|
390286
|
+
if ("5.24.1") {
|
|
390287
|
+
console5.log(`Using v${"5.24.1"} version`);
|
|
390288
390288
|
}
|
|
390289
390289
|
const report = await run2(process.argv);
|
|
390290
390290
|
console5.timeEnd(MAIN_TIMER_ID);
|
package/lib/markdown/index.js
CHANGED
|
@@ -111,7 +111,21 @@ var import_utils10 = require("@diplodoc/cli/lib/utils");
|
|
|
111
111
|
// src/core/markdown/loader/mangle-frontmatter.ts
|
|
112
112
|
var import_liquid = require("@diplodoc/liquid");
|
|
113
113
|
function safeExtractFrontmatter(content) {
|
|
114
|
-
|
|
114
|
+
try {
|
|
115
|
+
return (0, import_liquid.extractFrontMatter)(content);
|
|
116
|
+
} catch (error) {
|
|
117
|
+
const err = error;
|
|
118
|
+
if (err.reason === "duplicated mapping key") {
|
|
119
|
+
const line = typeof err.mark?.line === "number" ? err.mark.line + 1 : void 0;
|
|
120
|
+
const key = line === void 0 ? "" : content.split("\n")[line]?.trim().split(":")[0];
|
|
121
|
+
if (key && key !== "vcsPath") {
|
|
122
|
+
const context = `[Reason: "${err.reason}"; Line: ${line}; Key: "${key}"]`;
|
|
123
|
+
const errorMessage = `${this.path}: ${line}: YFM017 / invalid front matter format ${context}`;
|
|
124
|
+
this.logger.error(errorMessage);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return (0, import_liquid.extractFrontMatter)(content, { json: true });
|
|
128
|
+
}
|
|
115
129
|
}
|
|
116
130
|
function mangleFrontMatter(rawContent) {
|
|
117
131
|
const { vars, options } = this;
|
|
@@ -1191,7 +1205,11 @@ var MarkdownService = class {
|
|
|
1191
1205
|
const file = (0, import_utils11.normalizePath)(path);
|
|
1192
1206
|
const key = hash(file, from);
|
|
1193
1207
|
if (key in this.cache) {
|
|
1194
|
-
|
|
1208
|
+
const { content, varsMetadata, varsSystem, meta } = await this.cache[key];
|
|
1209
|
+
this.run.meta.addMetadata(file, varsMetadata);
|
|
1210
|
+
this.run.meta.addSystemVars(file, varsSystem);
|
|
1211
|
+
this.run.meta.add(file, meta, true);
|
|
1212
|
+
return content;
|
|
1195
1213
|
}
|
|
1196
1214
|
const defer = new import_utils11.Defer();
|
|
1197
1215
|
this.cache[key] = defer.promise;
|
|
@@ -1206,13 +1224,19 @@ var MarkdownService = class {
|
|
|
1206
1224
|
this.run.meta.addMetadata(file, vars.__metadata);
|
|
1207
1225
|
this.run.meta.addSystemVars(file, vars.__system);
|
|
1208
1226
|
this.run.meta.add(file, meta, true);
|
|
1209
|
-
|
|
1210
|
-
|
|
1227
|
+
const result = {
|
|
1228
|
+
content,
|
|
1229
|
+
varsMetadata: vars.__metadata,
|
|
1230
|
+
varsSystem: vars.__system,
|
|
1231
|
+
meta
|
|
1232
|
+
};
|
|
1233
|
+
this.cache[key] = result;
|
|
1234
|
+
defer.resolve(result);
|
|
1211
1235
|
await getHooks(this).Resolved.promise(content, file);
|
|
1212
1236
|
} catch (error) {
|
|
1213
1237
|
defer.reject(error);
|
|
1214
1238
|
}
|
|
1215
|
-
return defer.promise;
|
|
1239
|
+
return (await defer.promise).content;
|
|
1216
1240
|
}
|
|
1217
1241
|
async dump(file, markdown) {
|
|
1218
1242
|
const vfile = new import_utils11.VFile(file, markdown || await this.load(file));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/core/markdown/index.ts", "../../src/core/markdown/hooks.ts", "../../src/core/markdown/MarkdownService.ts", "../../src/core/markdown/loader.ts", "../../src/core/markdown/loader/mangle-frontmatter.ts", "../../src/core/markdown/loader/template-content.ts", "../../src/core/markdown/loader/resolve-comments.ts", "../../src/core/markdown/loader/resolve-deps.ts", "../../src/core/markdown/utils.ts", "../../src/core/markdown/loader/resolve-assets.ts", "../../src/core/markdown/loader/resolve-headings.ts", "../../src/core/markdown/loader/resolve-no-translate.ts", "../../src/core/markdown/loader/resolve-code.ts", "../../src/core/markdown/loader/resolve-conditions.ts"],
|
|
4
|
-
"sourcesContent": ["export * from './types';\n\nexport {getHooks} from './hooks';\nexport {MarkdownService} from './MarkdownService';\n", "import type {VFile} from '~/core/utils';\nimport type {Collect, Plugin} from './types';\nimport type {Meta} from '~/core/meta';\n\nimport {AsyncSeriesHook, AsyncSeriesWaterfallHook} from 'tapable';\n\nimport {generateHooksAccess} from '~/core/utils';\n\nexport function hooks(name: string) {\n return {\n Collects: new AsyncSeriesWaterfallHook<[Collect[]]>(['collects'], `${name}.Collects`),\n Plugins: new AsyncSeriesWaterfallHook<[Plugin[]]>(['plugins'], `${name}.Plugins`),\n Loaded: new AsyncSeriesHook<[string, DeepFrozen<Meta>, NormalizedPath]>(\n ['markdown', 'meta', 'path'],\n `${name}.Loaded`,\n ),\n Resolved: new AsyncSeriesHook<[string, NormalizedPath]>(\n ['markdown', 'path'],\n `${name}.Resolved`,\n ),\n Dump: new AsyncSeriesHook<VFile<string>>(['vfile'], `${name}.Dump`),\n };\n}\n\nconst [getHooks, withHooks] = generateHooksAccess('Markdown', hooks);\n\nexport {getHooks, withHooks};\n", "import type {Run as BaseRun} from '~/core/run';\nimport type {VarsService} from '~/core/vars';\nimport type {Meta, MetaService} from '~/core/meta';\nimport type {LoaderContext, TransformMode} from './loader';\nimport type {\n AssetInfo,\n Collect,\n EntryGraph,\n EntryInfo,\n GraphInfo,\n HeadingInfo,\n IncludeInfo,\n Location,\n Plugin,\n} from './types';\n\nimport {dirname, join} from 'node:path';\nimport {SourceMap} from '@diplodoc/liquid';\n\nimport {Buckets, Defer, Graph, VFile, all, bounded, fullPath, normalizePath} from '~/core/utils';\n\nimport {getHooks, withHooks} from './hooks';\nimport {LoaderAPI, loader} from './loader';\nimport {parseHeading} from './utils';\n\ntype MarkdownServiceConfig = {\n outputFormat: `${TransformMode}`;\n template: {\n enabled: boolean;\n keepNotVar: boolean;\n legacyConditions: boolean;\n features: {\n substitutions: boolean;\n conditions?: boolean | 'strict';\n };\n scopes: {\n code: boolean;\n };\n };\n preprocess?: {\n mergeSvg?: boolean;\n mergeIncludes?: boolean;\n hashIncludes?: boolean;\n mergeAutotitles?: boolean;\n };\n};\n\ntype Run = BaseRun<MarkdownServiceConfig> & {\n meta: MetaService;\n vars: VarsService;\n};\n\ntype Options = {\n mode: 'build' | 'translate';\n skipMissingVars: boolean;\n};\n\nfunction hash(path: NormalizedPath, from?: NormalizedPath) {\n return `${path}${from ? '+' + from : ''}`;\n}\n\nconst byLocation = (a: HeadingInfo, b: HeadingInfo) => a.location[0] - b.location[0];\n\n@withHooks\nexport class MarkdownService {\n readonly name = 'Markdown';\n\n get logger() {\n return this.run.logger;\n }\n\n get plugins() {\n return this._plugins.slice();\n }\n\n get collects() {\n return this._collects.slice();\n }\n\n get config() {\n return this.run.config;\n }\n\n private run: Run;\n\n private _collects: Collect[] = [];\n\n private _plugins: Plugin[] = [];\n\n private pathToMeta = new Buckets<Meta>();\n\n private pathToComments = new Buckets<Location[]>();\n\n private pathToDeps = new Buckets<IncludeInfo[]>();\n\n private pathToAssets = new Buckets<AssetInfo[]>();\n\n private pathToHeadings = new Buckets<HeadingInfo[]>();\n\n private pathToSourcemap = new Buckets<Record<number | string, string>>();\n\n private cache: Hash<Promise<string> | string> = {};\n\n private options;\n\n constructor(run: Run, options: Options = {mode: 'build', skipMissingVars: false}) {\n this.run = run;\n this.options = options;\n }\n\n @bounded async init() {\n this._collects = await getHooks(this).Collects.promise(this._collects);\n this._plugins = await getHooks(this).Plugins.promise(this._plugins);\n }\n\n @bounded async load(path: RelativePath, from?: NormalizedPath) {\n const file = normalizePath(path);\n const key = hash(file, from);\n\n if (key in this.cache) {\n return this.cache[key];\n }\n\n const defer = new Defer();\n\n this.cache[key] = defer.promise;\n\n try {\n const source = normalizePath(join(this.run.input, file)) as AbsolutePath;\n const raw = await this.run.read(source);\n const vars = this.run.vars.for(file, from);\n\n const context = this.loaderContext(file, raw, vars, this.proxy(key));\n const content = await loader.call(context, raw);\n\n // At this point all internal states are fully resolved.\n // So we don't expect Defer here.\n const meta = context.api.meta.get() as Meta;\n\n await getHooks(this).Loaded.promise(raw, meta, file);\n\n this.run.meta.addMetadata(file, vars.__metadata);\n this.run.meta.addSystemVars(file, vars.__system);\n this.run.meta.add(file, meta, true);\n\n this.cache[key] = content;\n defer.resolve(content);\n\n // TODO: this may trigger uncaught exceptions\n // But if we move this two lines above, then program exits unexpectedly\n await getHooks(this).Resolved.promise(content, file);\n } catch (error) {\n defer.reject(error);\n }\n\n return defer.promise;\n }\n\n @bounded async dump(file: NormalizedPath, markdown?: string) {\n const vfile = new VFile<string, EntryInfo>(file, markdown || (await this.load(file)));\n\n vfile.info = {title: '', headings: []};\n\n await getHooks(this).Dump.promise(vfile);\n\n return vfile;\n }\n\n async meta(path: RelativePath) {\n return this._meta(normalizePath(path));\n }\n\n async deps(path: RelativePath) {\n return this._deps(normalizePath(path));\n }\n\n async graph(path: RelativePath) {\n return this._graph(normalizePath(path));\n }\n\n async relations(path: RelativePath) {\n return this._relations(normalizePath(path));\n }\n\n async assets(path: RelativePath) {\n return this._assets(normalizePath(path));\n }\n\n async headings(path: RelativePath) {\n return this._headings(normalizePath(path));\n }\n\n async titles(path: RelativePath) {\n const file = normalizePath(path);\n\n const titles: Hash<string> = {};\n\n try {\n const headings = await this.headings(file);\n const contents = headings.map(({content}) => content);\n\n for (const content of contents) {\n const {level, title, anchors} = parseHeading(content);\n\n if (level === 1 && !titles['#']) {\n titles['#'] = title;\n }\n\n for (const anchor of anchors) {\n titles[anchor] = title;\n }\n }\n } catch {\n // This is acceptable.\n // If this is a real file and someone depends on his titles,\n // then we throw exception in md plugin.\n }\n\n return titles;\n }\n\n @bounded async inspect(path: RelativePath, raw: string, vars: Hash) {\n const file = normalizePath(path);\n const api = new LoaderAPI();\n const context = this.loaderContext(file, raw, vars, api);\n const content = await loader.call(context, raw);\n\n const deps = api.deps.get();\n const assets = [...api.assets.get()];\n\n return {content, deps, assets};\n }\n\n remap(path: RelativePath, line: number): number {\n const file = normalizePath(path);\n const sourcemap = this.pathToSourcemap.get(file);\n\n if (!sourcemap) {\n return line;\n }\n\n return Number(sourcemap[line]) || line;\n }\n\n release(path: NormalizedPath, from?: NormalizedPath) {\n const key = hash(path, from);\n\n delete this.cache[key];\n this.pathToDeps.delete(key);\n this.pathToMeta.delete(key);\n this.pathToAssets.delete(key);\n this.pathToHeadings.delete(key);\n this.pathToComments.delete(key);\n this.pathToSourcemap.delete(key);\n }\n\n private async _meta(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n return this.pathToMeta.get(key);\n }\n\n private async _deps(file: NormalizedPath, from?: NormalizedPath): Promise<IncludeInfo[]> {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const deps = this.pathToDeps.get(key) || [];\n const internals: IncludeInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path}) => {\n return this._deps(path, from || file);\n }),\n );\n\n return deps.concat(...internals);\n }\n\n private async _graph(path: NormalizedPath, from?: NormalizedPath): Promise<EntryGraph> {\n const key = hash(path, from);\n\n const content = await this.load(path, from);\n const assets = this.pathToAssets.get(key) || [];\n const deps = await all(\n (this.pathToDeps.get(key) || []).map(async (dep) => {\n return {\n ...dep,\n ...(await this._graph(dep.path, from || path)),\n };\n }),\n );\n\n return {path, content, deps, assets};\n }\n\n private async _relations(\n path: NormalizedPath,\n from?: NormalizedPath,\n ): Promise<Graph<GraphInfo>> {\n const key = hash(path, from);\n const graph = new Graph<GraphInfo>();\n\n graph.addNode(path, {type: 'entry'});\n\n await this.load(path, from);\n await all(\n (this.pathToDeps.get(key) || []).map(async (dep) => {\n graph.consume(await this._relations(dep.path, from || path));\n graph.setNodeData(dep.path, {type: 'source'});\n graph.addDependency(path, dep.path);\n }),\n );\n\n (this.pathToAssets.get(key) || []).map(async (asset) => {\n if (['image', 'video'].includes(asset.type)) {\n graph.addNode(asset.path);\n graph.setNodeData(asset.path, {type: 'resource'});\n graph.addDependency(path, asset.path);\n }\n\n if (['link'].includes(asset.type) && asset.autotitle) {\n graph.addNode(asset.path);\n graph.setNodeData(asset.path, {type: 'source'});\n graph.addDependency(path, asset.path);\n }\n });\n\n const meta = this.run.meta.get(path);\n const resources = ([] as string[]).concat(meta.script || [], meta.style || []);\n for (const resource of resources) {\n const file = normalizePath(join(dirname(path), resource));\n graph.addNode(file);\n graph.setNodeData(file, {type: 'resource'});\n graph.addDependency(path, file);\n }\n\n return graph;\n }\n\n private async _assets(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const assets = this.pathToAssets.get(key) || [];\n const internals: AssetInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path}) => {\n return this._assets(path, from || file);\n }),\n );\n\n return assets.concat(...internals);\n }\n\n private async _headings(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const headings = this.pathToHeadings.get(key) || [];\n const internals: HeadingInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path, location}) => {\n const headings = await this._headings(path, from || file);\n return headings.map((heading) => ({...heading, location}));\n }),\n );\n\n return headings.concat(...internals).sort(byLocation);\n }\n\n private proxy(key: string) {\n return {\n deps: this.pathToDeps.bind(key),\n assets: this.pathToAssets.bind(key),\n meta: this.pathToMeta.bind(key),\n comments: this.pathToComments.bind(key),\n headings: this.pathToHeadings.bind(key),\n sourcemap: this.pathToSourcemap.bind(key),\n };\n }\n\n private loaderContext(\n path: NormalizedPath,\n raw: string,\n vars: Hash,\n api?: Partial<LoaderAPI>,\n ): LoaderContext {\n return {\n path,\n vars,\n logger: this.logger,\n readFile: (path: RelativePath) => {\n return this.run.read(join(this.run.input, path));\n },\n emitFile: async (file: NormalizedPath, content: string) => {\n const rootPath = fullPath(file, path);\n await this.run.write(join(this.run.input, rootPath), content, true);\n },\n fullPath: (path: RelativePath) => join(this.run.input, path),\n input: this.run.input,\n api: new LoaderAPI(api),\n collects: this.collects,\n sourcemap: new SourceMap(raw),\n settings: {\n substitutions: this.config.template.features.substitutions,\n conditions:\n typeof this.config.template.features.conditions === 'string'\n ? (this.config.template.features.conditions as 'strict')\n : Boolean(this.config.template.features.conditions),\n conditionsInCode: this.config.template.scopes.code,\n keepNotVar: this.config.template.keepNotVar,\n legacyConditions: this.config.template.legacyConditions,\n keepConditionSyntaxOnTrue: this.options.mode === 'translate',\n },\n options: {\n disableLiquid: !this.config.template.enabled,\n mergeContentParts: this.config.preprocess?.mergeSvg ?? false,\n skipMissingVars: this.options.skipMissingVars,\n },\n mode: this.options.mode,\n };\n }\n}\n", "import type {LiquidContext, SourceMap} from '@diplodoc/liquid';\nimport type {Meta} from '~/core/meta';\nimport type {Logger} from '~/core/logger';\nimport type {Bucket} from '~/core/utils';\nimport type {AssetInfo, Collect, HeadingInfo, IncludeInfo, Location} from './types';\n\nimport {merge} from 'lodash';\n\nimport {bucket} from '~/core/utils';\n\nimport {mangleFrontMatter} from './loader/mangle-frontmatter';\nimport {templateContent} from './loader/template-content';\nimport {resolveComments} from './loader/resolve-comments';\nimport {resolveDependencies} from './loader/resolve-deps';\nimport {resolveAssets} from './loader/resolve-assets';\nimport {resolveHeadings} from './loader/resolve-headings';\nimport {resolveNoTranslate} from './loader/resolve-no-translate';\nimport {resolveBlockCodes} from './loader/resolve-code';\nimport {resolveConditions} from './loader/resolve-conditions';\n\nexport enum TransformMode {\n Html = 'html',\n Md = 'md',\n}\n\nexport class LoaderAPI {\n blockCodes: Bucket<Location[]>;\n comments: Bucket<Location[]>;\n deps: Bucket<IncludeInfo[]>;\n assets: Bucket<AssetInfo[]>;\n meta: Bucket<Meta>;\n headings: Bucket<HeadingInfo[]>;\n sourcemap: Bucket<Record<number | string, string>>;\n\n constructor(proxy: Partial<LoaderAPI> = {}) {\n this.blockCodes = proxy.blockCodes || bucket();\n this.deps = proxy.deps || bucket();\n this.assets = proxy.assets || bucket();\n this.meta = proxy.meta || bucket();\n this.comments = proxy.comments || bucket();\n this.headings = proxy.headings || bucket();\n this.sourcemap = proxy.sourcemap || bucket();\n }\n}\n\nexport type LoaderContext = LiquidContext & {\n path: NormalizedPath;\n vars: Hash;\n logger: Logger;\n emitFile(path: NormalizedPath, content: string): Promise<void>;\n readFile(path: NormalizedPath): Promise<string>;\n fullPath(path: RelativePath): AbsolutePath;\n input: AbsolutePath;\n collects: Collect[];\n api: LoaderAPI;\n sourcemap: SourceMap;\n options: {\n disableLiquid: boolean;\n mergeContentParts: boolean;\n skipMissingVars?: boolean;\n };\n mode: 'build' | 'translate';\n};\n\nexport async function loader(this: LoaderContext, content: string) {\n content = mangleFrontMatter.call(this, content);\n content = resolveNoTranslate.call(this, content);\n content = templateContent.call(this, content);\n content = resolveConditions.call(this, content);\n content = await applyCollectPlugins.call(this, content);\n content = resolveBlockCodes.call(this, content);\n content = resolveComments.call(this, content);\n content = resolveDependencies.call(this, content);\n content = resolveAssets.call(this, content);\n content = resolveHeadings.call(this, content);\n\n this.api.sourcemap.set(this.sourcemap.dump());\n\n return content;\n}\n\nasync function applyCollectPlugins(this: LoaderContext, content: string) {\n let meta = {};\n\n for (const collect of this.collects) {\n let result = await collect.call(this, content, {});\n\n if (Array.isArray(result)) {\n meta = merge(meta, result[1] || {});\n result = result[0] as string;\n }\n\n if (result !== undefined) {\n content = result as string;\n }\n }\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nimport {extractFrontMatter, liquidJson} from '@diplodoc/liquid';\n\nfunction safeExtractFrontmatter(this: LoaderContext, content: string) {\n return extractFrontMatter(content, {json: true});\n}\n\nexport function mangleFrontMatter(this: LoaderContext, rawContent: string) {\n const {vars, options} = this;\n const {disableLiquid} = options;\n\n const [frontmatter, content, rawFrontmatter] = safeExtractFrontmatter.call(this, rawContent);\n\n if (!rawFrontmatter) {\n this.api.meta.set({});\n return rawContent;\n }\n\n if (disableLiquid) {\n this.api.meta.set(frontmatter);\n } else {\n this.api.meta.set(liquidJson.call(this, frontmatter, vars));\n }\n\n this.sourcemap.delete(1, rawFrontmatter);\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nimport {liquidDocument, liquidSnippet} from '@diplodoc/liquid';\n\nexport function templateContent(this: LoaderContext, rawContent: string) {\n const {vars, options} = this;\n const {disableLiquid} = options;\n\n if (disableLiquid) {\n return rawContent;\n }\n\n let content;\n\n if (this.mode === 'translate') {\n content = liquidDocument.call(this, rawContent, vars);\n } else {\n content = liquidSnippet.call(this, rawContent, vars, this.sourcemap);\n }\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nexport function resolveComments(this: LoaderContext, content: string) {\n const COMMENTS_CONTENTS = /<!-{2,}[\\s\\S]*?-{2,}>/g;\n const comments = [];\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = COMMENTS_CONTENTS.exec(content))) {\n comments.push([match.index, COMMENTS_CONTENTS.lastIndex] as [number, number]);\n }\n\n this.api.comments.set(comments);\n\n return content;\n}\n", "import type {IncludeInfo} from '../types';\nimport type {LoaderContext} from '../loader';\n\nimport {dirname, join} from 'node:path';\n\nimport {normalizePath, parseLocalUrl, rebasePath} from '~/core/utils';\n\nimport {filterRanges, findLink} from '../utils';\n\nexport function resolveDependencies(this: LoaderContext, content: string) {\n const includes = [];\n const exclude = [...this.api.comments.get()];\n\n // Include example: {% include [createfolder](create-folder.md) %}\n // Regexp result: [createfolder](create-folder.md)\n const INCLUDE_CONTENTS = /{%\\s*include\\s*.+?%}/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = INCLUDE_CONTENTS.exec(content))) {\n // Ugly workaround for include examples\n // TODO: rewrite all inspect code on markdown-it parsing with minimal set of plugins\n if (content[match.index - 1] === '`') {\n continue;\n }\n\n const link = findLink(match[0]) as string;\n // TODO: warn about non local urls\n const include = parseLocalUrl<IncludeInfo>(link);\n\n if (include && include.path) {\n const currentPath = this.path;\n const normalizedIncludePath = normalizePath(join(dirname(currentPath), include.path));\n\n if (normalizedIncludePath === currentPath) {\n this.logger.error('YFM016', `${currentPath}: The file is included in itself`);\n\n continue;\n }\n\n include.path = rebasePath(currentPath, include.path as RelativePath);\n include.link = link;\n include.match = content.slice(match.index, INCLUDE_CONTENTS.lastIndex);\n include.location = [match.index, INCLUDE_CONTENTS.lastIndex];\n\n includes.push(include);\n }\n }\n\n this.api.deps.set(filterRanges(exclude, includes));\n\n return content;\n}\n", "import type {AssetInfo, ImageOptions, Location} from './types';\nimport type {ConstructorBlock, PageContent} from '@diplodoc/page-constructor-extension';\n\nimport {load as yamlLoad} from 'js-yaml';\n\nimport {MEDIA_FORMATS, parseLocalUrl, walkLinks} from '~/core/utils';\n\ntype AssetModifier = '!' | '@' | '';\n\nconst modifiers = {'!': 'image', '@': 'video', '': 'link'} as const;\n\nexport function findLink(content: string): string | undefined {\n const rx = /]\\(\\s*/g;\n const match = rx.exec(content);\n if (!match) {\n return undefined;\n }\n\n const link = parseLinkDestination(content, rx.lastIndex);\n\n if (link === null || link.match(/[${}]/)) {\n return undefined;\n }\n\n rx.lastIndex += link.length + 1;\n\n return link;\n}\n\nexport function extractImages(block: ConstructorBlock | string): string[] {\n const images: string[] = [];\n\n if (!block) {\n return images;\n }\n\n if (typeof block === 'string') {\n const trimmedBlock = block.trim();\n\n if (MEDIA_FORMATS.test(trimmedBlock) && trimmedBlock.split(/\\s+/).length === 1) {\n images.push(trimmedBlock);\n }\n\n return images;\n }\n\n walkLinks(block, (value) => {\n if (MEDIA_FORMATS.test(value) && value.split(/\\s+/).length === 1) {\n images.push(value);\n }\n });\n\n return images;\n}\n\nexport function parsePcBlocks(blocks: ConstructorBlock[] = [], images: string[] = []): string[] {\n for (const block of blocks) {\n images.push(...extractImages(block));\n }\n\n return images;\n}\n\nexport function getPcIconTitle(iconPath: string): string {\n const file = iconPath.split('/').pop() || iconPath;\n\n return file.replace(/\\.[^.]+$/, '');\n}\n\nexport const PC_REGEX = /^([ \\t]*):::\\s*page-constructor[ \\t]*\\r?\\n?/m;\n\nexport function findPcImages(content: string): AssetInfo[] {\n const pcImages: AssetInfo[] = [];\n const openRegex = new RegExp(PC_REGEX.source, PC_REGEX.flags);\n\n let searchStart = 0;\n\n while (searchStart < content.length) {\n const remaining = content.slice(searchStart);\n const match = openRegex.exec(remaining);\n\n if (!match) {\n break;\n }\n\n const indent = match[1] || '';\n const matchIndex = searchStart + match.index;\n const startIdx = matchIndex + match[0].length;\n const closeRegex = new RegExp(`^${indent}:::[ \\\\t]*$`, 'm');\n const afterMatch = content.slice(startIdx);\n const closeMatch = closeRegex.exec(afterMatch);\n\n if (!closeMatch) {\n searchStart = startIdx;\n continue;\n }\n\n const rawBlock = afterMatch.slice(0, closeMatch.index);\n let data: PageContent;\n\n try {\n data = yamlLoad(rawBlock) as PageContent;\n } catch {\n searchStart = startIdx;\n continue;\n }\n\n const images = parsePcBlocks(data?.blocks as ConstructorBlock[], []);\n\n for (const img of images) {\n const parsed = parseLocalUrl(img);\n\n if (!parsed) {\n continue;\n }\n\n const blockEnd = startIdx + closeMatch.index + closeMatch[0].length;\n\n pcImages.push({\n ...parsed,\n type: 'image',\n subtype: 'image',\n title: getPcIconTitle(img),\n autotitle: false,\n hash: null,\n search: null,\n location: [matchIndex, blockEnd],\n // no inline svg inside page-constructor because we hasn't a location for asset\n options: {width: undefined, height: undefined, inline: false},\n });\n }\n\n searchStart = startIdx + closeMatch.index + closeMatch[0].length;\n }\n\n return pcImages;\n}\n\nexport function findLinksInfo(content: string): AssetInfo[] {\n const links = find(/]\\(\\s*/g, content, (match, rx) => {\n const link = parseLinkDestination(content, rx.lastIndex);\n const title = parseLinkTitle(content, rx.lastIndex - match[0].length);\n const options = parseLinkOptions(content, rx.lastIndex + (link?.length || 0) + 1);\n\n // TODO: add more precise filter for unix compatible paths\n if (link === null || title === null || link.match(/[${}]/)) {\n return undefined;\n }\n\n const parsed = parseLocalUrl(link);\n if (!parsed) {\n return undefined;\n }\n\n const modifier = content[\n rx.lastIndex - match[0].length - title.length - 2\n ] as AssetModifier;\n const type = modifiers[modifier] || 'link';\n\n rx.lastIndex += link.length + 1;\n\n return {\n ...parsed,\n type,\n subtype: type === 'image' ? 'image' : null,\n title,\n autotitle: type === 'link' && (!title || title === '{#T}'),\n options,\n };\n });\n\n const referenceLinks = find(/]\\[\\s*/g, content, (match, rx) => {\n let link = parseLinkDestination(content, rx.lastIndex, ['[', ']']);\n let title = parseLinkTitle(content, rx.lastIndex - match[0].length);\n const options = parseLinkOptions(content, rx.lastIndex + (link?.length || 0) + 1);\n\n // TODO: add more precise filter for unix compatible paths\n if ((link === null && title === null) || link?.match(/[${}]/)) {\n return undefined;\n }\n title = title || '';\n link = link || title;\n\n const parsed = parseLocalUrl(link);\n if (!parsed) {\n return undefined;\n }\n\n const modifier = content[\n rx.lastIndex - match[0].length - title.length - 2\n ] as AssetModifier;\n const type = modifiers[modifier] || 'link';\n\n rx.lastIndex += (content[rx.lastIndex] === ']' ? 0 : link.length) + 1;\n\n return {\n ...parsed,\n type,\n subtype: 'reference',\n code: link,\n title,\n autotitle: type === 'link' && (!title || title === '{#T}'),\n options,\n };\n });\n\n return [...links, ...referenceLinks];\n}\n\nexport function findDefs(content: string): AssetInfo[] {\n return find(/^\\s*\\[(.*?)]:\\s*([^\\s]+)/gm, content, (match) => {\n const parsed = parseLocalUrl(match[2]);\n if (!parsed) {\n return undefined;\n }\n\n return {\n ...parsed,\n type: 'def',\n code: match[1] || undefined,\n title: '',\n autotitle: true,\n };\n });\n}\n\nfunction find(\n matcher: RegExp,\n content: string,\n map: (match: RegExpMatchArray, rx: RegExp) => Omit<AssetInfo, 'location'> | void,\n): AssetInfo[] {\n const links: AssetInfo[] = [];\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = matcher.exec(content))) {\n const result = map(match, matcher);\n if (!result) {\n continue;\n }\n\n if (result) {\n links.push({\n ...result,\n location: [match.index, matcher.lastIndex],\n });\n }\n }\n\n return links;\n}\n\nfunction parseLinkDestination(str: string, start: number, symbols = ['(', ')']) {\n const max = str.length;\n const [symbolStart, symbolEnd] = symbols.map((symbol) => symbol.charCodeAt(0));\n\n let code,\n level = 0,\n pos = start;\n\n if (str.charCodeAt(pos) === 0x3c /* < */) {\n return parseSimpleLink(str, start + 1);\n }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x20) {\n break;\n }\n\n // ascii control characters\n if (code < 0x20 || code === 0x7f) {\n break;\n }\n\n if (code === 0x5c /* \\ */ && pos + 1 < max) {\n if (str.charCodeAt(pos + 1) === 0x20) {\n break;\n }\n pos += 2;\n continue;\n }\n\n if (code === symbolStart /* ( or [ */) {\n level++;\n if (level > 32) {\n return null;\n }\n }\n\n if (code === symbolEnd /* ) or ] */) {\n if (level === 0) {\n break;\n }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos) {\n return null;\n }\n if (level !== 0) {\n return null;\n }\n\n return str.slice(start, pos);\n}\n\nfunction parseLinkTitle(str: string, start: number) {\n let code,\n prev,\n level = 0,\n pos = start;\n\n while (pos >= 0) {\n code = str.charCodeAt(pos);\n prev = str.charCodeAt(pos - 1);\n\n // ascii control characters\n if (code < 0x20 || code === 0x7f) {\n break;\n }\n\n if (prev === 0x5c /* \\ */) {\n pos -= 2;\n continue;\n }\n\n if (code === 93 /* ] */) {\n level++;\n if (level > 32) {\n return null;\n }\n }\n\n if (code === 91 /* [ */) {\n if (level === 1) {\n break;\n }\n level--;\n }\n\n pos--;\n }\n\n return str.slice(pos + 1, start);\n}\n\nfunction parseLinkOptions(str: string, start: number): ImageOptions {\n const max = str.length;\n const options: ImageOptions = {\n width: undefined,\n height: undefined,\n inline: undefined,\n };\n let code,\n level = 0,\n pos = start,\n startOption = start;\n\n if (str[pos - 1] !== ')') {\n level--;\n }\n if (str.charCodeAt(pos) !== 0x7b /* { */ && level === 0) {\n return options;\n }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x29 /* ) */ && level === -1) {\n if (str.charCodeAt(pos + 1) !== 0x7b) {\n return options;\n }\n level++;\n }\n\n if (code === 0x7b /* { */ && level > -1) {\n level++;\n startOption = pos + 1;\n if (level > 32) {\n return options;\n }\n }\n\n if (code === 0x7d /* } */) {\n if (level === 1) {\n level--;\n break;\n }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos || level !== 0) {\n return options;\n }\n\n const attrRegex = /(\\w+)=(?:'([^']*)'|\"([^\"]*)\"|(\\S+))/g;\n const optionsString = str.slice(startOption, pos);\n let match;\n\n while ((match = attrRegex.exec(optionsString)) !== null) {\n const key = match[1] as keyof ImageOptions;\n const value = match[2] || match[3] || match[4];\n\n if (key === 'inline') {\n options[key] = value === 'true';\n } else {\n options[key] = value;\n }\n }\n\n return options;\n}\n\nfunction parseSimpleLink(str: string, start: number) {\n const max = str.length;\n\n let code,\n pos = start;\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === 0x0a /* \\n */) {\n return null;\n }\n if (code === 0x3c /* < */) {\n return null;\n }\n if (code === 0x3e /* > */) {\n return str.slice(start, pos);\n }\n if (code === 0x5c /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n pos++;\n }\n\n // no closing '>'\n return null;\n}\n\nexport function filterRanges<T extends {location: Location}>(\n excludes: Location[],\n infos: T[],\n): T[] {\n const contains = (exclude: Location, point: Location) => {\n return (\n (exclude[1] >= point[0] && exclude[1] <= point[1]) ||\n (exclude[0] >= point[0] && exclude[0] < point[1]) ||\n (exclude[0] < point[0] && exclude[1] >= point[1])\n );\n };\n\n return infos.filter((item) => {\n return !excludes.some((exclude) => contains(exclude, item.location));\n });\n}\n\nexport function parseHeading(content: string) {\n const anchors = [];\n const commonHeading = content.match(/^#+/);\n const alternateHeading = content[content.length - 1];\n const alternaleLevels = ['-', '='];\n const level = commonHeading\n ? commonHeading[0].length\n : alternaleLevels.indexOf(alternateHeading) + 1;\n\n if (commonHeading) {\n content = content.replace(/^#+\\s*/, '');\n } else {\n content = content.replace(/\\n[-=]+$/, '');\n }\n\n const ANCHOR = /[^[]{(#[^}]+)}/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = ANCHOR.exec(content))) {\n anchors.push(match[1]);\n content = content.replace(match[0], '');\n ANCHOR.lastIndex -= match[0].length;\n }\n\n const title = content.trim();\n\n return {anchors, title, level};\n}\n", "import type {LoaderContext} from '../loader';\nimport type {AssetInfo} from '../types';\n\nimport {join} from 'node:path';\n\nimport {fs, normalizePath, rebasePath} from '~/core/utils';\n\nimport {filterRanges, findDefs, findLinksInfo, findPcImages} from '../utils';\n\nfunction fixUnreachableLink(path: RelativePath, loaderContext: LoaderContext) {\n let newPath = path;\n const pathnameParts = normalizePath(path).split('/');\n const relativePartsCount = pathnameParts.filter((part: string) => part === '..').length;\n let includedFilePath;\n\n for (let i = 0; i <= relativePartsCount; i++) {\n try {\n includedFilePath = normalizePath(\n join(loaderContext.input, pathnameParts.slice(i).join('/')),\n );\n fs.realpathSync(includedFilePath);\n if (i > 0) {\n newPath = normalizePath(pathnameParts.slice(i).join('/'));\n loaderContext.logger.error(`Path was fixed from ${path} \n to ${newPath}`);\n }\n return newPath;\n } catch {\n if (i === relativePartsCount - 1) {\n return newPath;\n } else {\n continue;\n }\n }\n }\n return newPath;\n}\n\nfunction getSize(\n path: RelativePath,\n loaderContext: LoaderContext,\n assetSizes: Map<RelativePath, number>,\n) {\n if (path === null) {\n return 0;\n }\n if (assetSizes.has(path)) {\n return assetSizes.get(path) as number;\n }\n\n try {\n const fixedPath = fixUnreachableLink(path, loaderContext);\n const fullPath = loaderContext.fullPath(fixedPath);\n const size = fs.statSync(fullPath).size;\n assetSizes.set(path, size);\n return size;\n } catch {\n assetSizes.set(path, 0);\n return 0;\n }\n}\n\nexport function resolveAssets(this: LoaderContext, content: string) {\n const assets: AssetInfo[] = [];\n const assetSizes = new Map<RelativePath, number>();\n\n const exclude = [\n ...this.api.deps.get().map(({location}) => location),\n ...this.api.comments.get(),\n ...this.api.blockCodes.get(),\n ];\n\n const defs = filterRanges(exclude, findDefs(content));\n const links = filterRanges(exclude, findLinksInfo(content));\n const pcImages = filterRanges(exclude, findPcImages(content));\n\n for (const info of [...defs, ...links, ...pcImages]) {\n try {\n if (info.path !== null && !info.path?.startsWith('*') && !info.path?.includes('%')) {\n info.path = rebasePath(this.path, decodeURIComponent(info.path) as RelativePath);\n }\n\n let size = 0;\n if (['def', 'image'].includes(info.type) && info.subtype === 'image') {\n size = getSize(info.path, this, assetSizes);\n }\n\n assets.push({...info, size});\n } catch (error) {\n this.logger.warn(`Error processing asset from ${this.path} to ${info.path}: ${error}`);\n }\n }\n\n this.api.assets.set([...assets]);\n\n return content;\n}\n", "import type {Location} from '../types';\nimport type {LoaderContext} from '../loader';\n\nimport {filterRanges} from '../utils';\n\nexport function resolveHeadings(this: LoaderContext, content: string) {\n const headings = [];\n const exclude = [...this.api.comments.get()];\n\n const heading = /(?<=^|\\n)([#=-])/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = heading.exec(content))) {\n const [result, location] =\n match[1] === '#'\n ? findCommonHeading(match.index, content)\n : findAlternateHeading(match.index, content);\n\n if (result) {\n headings.push({content: result, location});\n heading.lastIndex = location[1];\n }\n }\n\n this.api.headings.set(filterRanges(exclude, headings));\n\n return content;\n}\n\nconst SPACE = /[ \\t]/;\n\nfunction findCommonHeading(start: number, content: string): [string, Location] | never[] {\n let title = '';\n\n let index = start;\n while (index < content.length) {\n if (index - start > 6) {\n return [];\n }\n\n if (content[index] === '#') {\n index++;\n } else if (content[index].match(SPACE)) {\n break;\n } else {\n return [];\n }\n }\n\n while (index < content.length) {\n if (content[index + 1] && content[index] !== '\\n') {\n title += content[index];\n index++;\n } else if (title.trim()) {\n return [content.slice(start, index), [start, index]];\n } else {\n return [];\n }\n }\n\n return [];\n}\n\nfunction findAlternateHeading(start: number, content: string): [string, Location] | never[] {\n const delim = content[start];\n const newline = [];\n\n let title = '';\n\n let end = start;\n while (end < content.length) {\n if (content[end] === delim) {\n end++;\n } else if (content[end] === '\\n' || !content[end + 1]) {\n break;\n } else {\n return [];\n }\n }\n\n let index = start - 1;\n while (index >= 0) {\n const isContentStart = !index;\n const isTitleStart = newline.length === 2 && !content.slice(...newline).trim();\n\n if (newline.length && !isTitleStart) {\n newline.length = 1;\n }\n\n if (!isTitleStart) {\n title = content[index] + title;\n }\n\n if (isContentStart || isTitleStart) {\n const clean = title.trimStart();\n if (clean) {\n return [content.slice(start - clean.length, end), [start - clean.length, end]];\n } else {\n return [];\n }\n }\n\n if (content[index] === '\\n') {\n newline.unshift(index);\n }\n\n index--;\n }\n\n return [];\n}\n", "import type {LoaderContext} from '../loader';\n\nexport function resolveNoTranslate(this: LoaderContext, content: string) {\n if (this.mode === 'translate') {\n return content;\n }\n\n content = resolveContainerDirectives(content);\n\n content = resolveLeafBlockDirectives(content);\n\n content = resolveInlineDirectives(content);\n\n return content;\n}\n\nfunction resolveContainerDirectives(content: string): string {\n const lines = content.split('\\n');\n const result = [];\n\n const stack = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.trim().startsWith(':::')) {\n const directiveLine = line.trim();\n\n if (directiveLine === ':::') {\n if (stack.length > 0) {\n const lastDirective = stack.pop();\n\n if (lastDirective === 'no-translate' && stack.length === 0) {\n continue;\n }\n\n result.push(line);\n }\n } else {\n const directiveMatch = directiveLine.match(/^:::\\s*([^\\s]+)/);\n const directiveName = directiveMatch ? directiveMatch[1] : '';\n\n if (directiveName === 'no-translate') {\n stack.push('no-translate');\n continue;\n } else {\n stack.push(directiveName);\n result.push(line);\n }\n }\n } else {\n result.push(line);\n }\n }\n\n return result.join('\\n');\n}\n\nfunction resolveLeafBlockDirectives(content: string): string {\n const blockRegex = /::\\s*no-translate\\s*\\[([\\s\\S]*?)\\]/g;\n\n return content.replace(blockRegex, (_, innerContent) => {\n return innerContent;\n });\n}\n\nfunction resolveInlineDirectives(content: string): string {\n const inlineRegex = /(?<![:]):no-translate\\s*\\[([\\s\\S]*?)\\]/g;\n\n return content.replace(inlineRegex, (_, innerContent) => {\n return innerContent;\n });\n}\n", "import type {LoaderContext} from '../loader';\nimport type Token from 'markdown-it/lib/token';\n\nimport MarkdownIt from 'markdown-it';\n// @ts-ignore\nimport deflist from 'markdown-it-deflist';\nimport imsize from '@diplodoc/transform/lib/plugins/imsize';\nimport yfmTable from '@diplodoc/transform/lib/plugins/table';\n\nfunction computeLineStarts(lines: string[]): number[] {\n const lineStarts: number[] = [0];\n for (let i = 1; i < lines.length; i++) {\n const lineEndingLength = 1; //lines[i - 1].endsWith('\\r') ? 2 : 1;\n lineStarts[i] = lineStarts[i - 1] + lines[i - 1].length + lineEndingLength;\n }\n return lineStarts;\n}\n\nconst lineToCharPosition = (line: number, lineStarts: number[], content: string): number =>\n line >= lineStarts.length ? content.length : lineStarts[line];\n\nfunction calculateAdjustedEnd(\n endLine: number,\n lineStarts: number[],\n lines: string[],\n content: string,\n): number {\n let end = content.length;\n if (endLine <= lineStarts.length) {\n end = endLine === 0 ? 0 : lineStarts[endLine - 1] + lines[endLine - 1].length;\n }\n return endLine <= lines.length && endLine > 0 ? end + 1 : end;\n}\n\n// Process block code tokens (fence and code_block)\nfunction processBlockCode(\n token: Token,\n lineStarts: number[],\n lines: string[],\n content: string,\n codes: Array<[number, number]>,\n) {\n if (!token.map || token.map.length !== 2) {\n return;\n }\n\n const [startLine, endLine] = token.map;\n\n const start = lineToCharPosition(startLine, lineStarts, content);\n\n let adjustedEnd: number;\n if (token.type === 'fence' && endLine <= lines.length) {\n const endLineContent = lines[endLine - 1] || '';\n const fenceEndIndex = endLineContent.indexOf(token.markup);\n if (fenceEndIndex > -1) {\n const lineStart = lineStarts[endLine - 1] || 0;\n const fenceEndPos = lineStart + fenceEndIndex + token.markup.length;\n adjustedEnd = fenceEndPos;\n } else {\n adjustedEnd = calculateAdjustedEnd(endLine, lineStarts, lines, content);\n }\n } else {\n adjustedEnd = calculateAdjustedEnd(endLine, lineStarts, lines, content);\n }\n\n codes.push([start, adjustedEnd]);\n}\n\n// Check specific attribute in image part\nfunction checkAttribute(\n imagePart: string,\n matchStart: number,\n codeText: string | null,\n start: number | undefined,\n end: number | undefined,\n regex: RegExp,\n getAttrStart: (matchStart: number, imagePart: string) => number,\n): boolean {\n const match = imagePart.match(regex);\n if (match) {\n if (codeText !== null) {\n // Check if code text is in attributes\n if (match[1].includes(codeText)) {\n return true;\n }\n } else if (start !== undefined && end !== undefined) {\n // Check if code range falls within attributes\n const attrStart = getAttrStart(matchStart, imagePart);\n const attrEnd = attrStart + match[0].length;\n if (start >= attrStart && end <= attrEnd) {\n return true;\n }\n }\n }\n return false;\n}\n\n// Check attributes in image part\nfunction checkImageAttributes(\n imagePart: string,\n matchStart: number,\n codeText: string | null,\n start?: number,\n end?: number,\n): {braceMatch: boolean; quoteMatch: boolean} {\n // Check attributes in curly braces {...}\n const braceMatch = checkAttribute(\n imagePart,\n matchStart,\n codeText,\n start,\n end,\n /\\s*{([^}]*)}/,\n (matchStart, imagePart) => matchStart + imagePart.indexOf('{'),\n );\n\n // Check title attribute in quotes \"...\"\n const quoteMatch = checkAttribute(\n imagePart,\n matchStart,\n codeText,\n start,\n end,\n /\\s*\"([^\"]*)\"/,\n (matchStart, imagePart) => matchStart + imagePart.indexOf('\"'),\n );\n\n return {braceMatch, quoteMatch};\n}\n\n// Add code to array and update position\nfunction addCodeAndUpdatePosition(\n startIndex: number,\n endIndex: number,\n content: string,\n codes: Array<[number, number]>,\n parentStartPos: number,\n lines: string[],\n): number {\n // Check if this code is inside image attributes\n const insideAttrs = isInsideImageAttributes(content, startIndex, endIndex, lines);\n if (!insideAttrs) {\n codes.push([startIndex, endIndex]);\n }\n\n // Update parentStartPos to avoid finding the same match again\n return insideAttrs ? parentStartPos : Math.max(parentStartPos, endIndex);\n}\n\n// Process inline code tokens\nfunction processInlineCode(\n token: Token,\n content: string,\n parentStartPos: number,\n codes: Array<[number, number]>,\n lineStarts: number[],\n lines: string[],\n): number {\n if (!token.markup || !token.content) {\n return parentStartPos;\n }\n\n // Use token's position information if available\n if (token.map && token.map.length === 2) {\n const [startLine, _endLine] = token.map;\n const start = lineToCharPosition(startLine, lineStarts, content);\n\n // Find the exact position of the inline code within the line\n const lineContent = lines[startLine] || '';\n const searchPattern = token.markup + token.content + token.markup;\n const patternIndex = lineContent.indexOf(searchPattern);\n\n if (patternIndex !== -1) {\n const startIndex = start + patternIndex;\n const endIndex = startIndex + searchPattern.length;\n\n return addCodeAndUpdatePosition(\n startIndex,\n endIndex,\n content,\n codes,\n parentStartPos,\n lines,\n );\n }\n } else {\n const searchPattern = token.markup + token.content + token.markup;\n const startIndex = content.indexOf(searchPattern, parentStartPos);\n\n if (startIndex !== -1) {\n const endIndex = startIndex + searchPattern.length;\n\n return addCodeAndUpdatePosition(\n startIndex,\n endIndex,\n content,\n codes,\n parentStartPos,\n lines,\n );\n }\n }\n\n return parentStartPos;\n}\n\n// Function to check if code is inside image attributes\nfunction isInsideImageAttributes(\n content: string,\n start: number,\n end: number,\n lines: string[],\n): boolean {\n // Limit regex search to a smaller window around the code for better performance\n const windowSize = 200; // Reduced window size for better performance\n const checkStart = Math.max(0, start - windowSize);\n const checkEnd = Math.min(content.length, end + windowSize);\n const contentWindow = content.substring(checkStart, checkEnd);\n\n // Only search for images in the limited window\n const imageRegex = /!\\[[^\\]]*\\]\\([^)]*\\)(?:\\s*\"[^\"]*\")?(?:\\s*{[^}]*})?/g;\n\n let match;\n while ((match = imageRegex.exec(contentWindow)) !== null) {\n // Adjust positions to global content positions\n const matchStart = match.index + checkStart;\n const matchEnd = matchStart + match[0].length;\n\n // Check if code range falls within this image\n if (start >= matchStart && end <= matchEnd) {\n // Check if code is in attributes\n const imagePart = match[0];\n // Adjust positions relative to the image part\n const relativeStart = start - matchStart;\n const relativeEnd = end - matchStart;\n const {braceMatch, quoteMatch} = checkImageAttributes(\n imagePart,\n matchStart,\n null,\n relativeStart,\n relativeEnd,\n );\n if (braceMatch || quoteMatch) {\n return true;\n }\n }\n }\n\n // Additional check: if code is in attributes of any image in the document,\n // then it should not be marked as code block\n const codeContent = content.substring(start, end);\n const codeText = codeContent.replace(/`/g, ''); // Remove backticks\n // TODO:goldserg not optimized block (increase time at 6 times)\n // Find all images in the document\n const allImagesRegex = /!\\[[^\\]]*\\]\\([^)]*\\)(?:\\s*\"[^\"]*\")?(?:\\s*{[^}]*})?/gs;\n let imageMatch;\n while ((imageMatch = allImagesRegex.exec(contentWindow)) !== null) {\n // Check if code is in image attributes\n const imagePart = imageMatch[0];\n const {braceMatch, quoteMatch} = checkImageAttributes(\n imagePart,\n imageMatch.index,\n codeText,\n );\n if (braceMatch || quoteMatch) {\n return true;\n }\n }\n\n // Additional check for YFM tables: if code is in one table cell,\n // and image in another cell of the same row, then code should not be marked as code block\n // Check if code is in YFM table context\n let lineIndex = 0;\n let charCount = 0;\n\n // Find the line where the code is located\n for (let i = 0; i < lines.length; i++) {\n if (charCount <= start && start < charCount + lines[i].length + 1) {\n lineIndex = i;\n break;\n }\n charCount += lines[i].length + 1;\n }\n\n // Check if line is in YFM table context\n if (lineIndex > 0 && lineIndex < lines.length - 1) {\n const prevLine = lines[lineIndex - 1];\n const currentLine = lines[lineIndex];\n const nextLine = lines[lineIndex + 1];\n\n // In YFM table, if code is in one cell and image in another,\n // then code should not be marked as code block\n // We need to check if code is in the same line as image\n if (\n prevLine.trim().startsWith('#|') &&\n nextLine.trim().startsWith('|#') &&\n currentLine.includes('\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n// Process inline tokens that may contain inline code\nfunction processInlineToken(\n token: Token,\n lineStarts: number[],\n content: string,\n parentStartPos: number,\n): number {\n if (!token.children || token.children.length === 0) {\n return parentStartPos;\n }\n\n let inlineStartPos = parentStartPos;\n if (token.map && token.map.length === 2) {\n const [startLine] = token.map;\n inlineStartPos = lineToCharPosition(startLine, lineStarts, content);\n }\n\n return inlineStartPos;\n}\n\nexport function resolveBlockCodes(this: LoaderContext, content: string) {\n if (!this.options.mergeContentParts || !content.includes('![')) {\n this.api.blockCodes.set([]);\n return content;\n }\n const md = new MarkdownIt({html: true});\n const diplodocOptions = {\n notesAutotitle: false,\n path: '',\n };\n\n md.use(deflist, diplodocOptions);\n md.use(imsize, diplodocOptions);\n md.use(yfmTable, diplodocOptions);\n\n const tokens = md.parse(content, {});\n\n const codes: Array<[number, number]> = [];\n\n const lines = content.split('\\n');\n const lineStarts = computeLineStarts(lines);\n\n function extractCodeBlocks(\n tokens: Token[],\n parentStartPos = 0,\n parentType: string | null = null,\n ) {\n for (const token of tokens) {\n let currentParentStartPos = parentStartPos;\n\n if (token.type === 'fence' || token.type === 'code_block') {\n processBlockCode(token, lineStarts, lines, content, codes);\n } else if (token.type === 'inline') {\n currentParentStartPos = processInlineToken(\n token,\n lineStarts,\n content,\n currentParentStartPos,\n );\n } else if (token.type === 'code_inline') {\n // Skip code_inline tokens that are children of image tokens\n if (parentType !== 'image') {\n currentParentStartPos = processInlineCode(\n token,\n content,\n currentParentStartPos,\n codes,\n lineStarts,\n lines,\n );\n }\n }\n\n if (token.children && token.children.length > 0) {\n extractCodeBlocks(token.children, currentParentStartPos, token.type);\n }\n }\n }\n\n extractCodeBlocks(tokens);\n\n this.api.blockCodes.set(codes);\n\n return content;\n}\n", "import type {PageContent} from '@diplodoc/page-constructor-extension';\nimport type {LoaderContext} from '../loader';\nimport type {Logger} from '~/core/logger';\n\nimport {dump as yamlDump, load as yamlLoad} from 'js-yaml';\n\nimport {filterBlocksByConditions, hasWhenConditions} from '~/core/utils';\n\nimport {PC_REGEX} from '../utils';\n\ntype Replacement = {\n start: number;\n end: number;\n replacement: string;\n};\n\ntype ProcessOptions = {\n vars: Record<string, unknown>;\n skipMissingVars: boolean;\n logger: Logger;\n path: NormalizedPath;\n};\n\nfunction processPageConstructorBlocks(content: string, options: ProcessOptions): string {\n const {vars, skipMissingVars, logger, path} = options;\n const blocks: Replacement[] = [];\n const openRegex = new RegExp(PC_REGEX.source, PC_REGEX.flags);\n\n let searchStart = 0;\n\n while (searchStart < content.length) {\n const remaining = content.slice(searchStart);\n const match = openRegex.exec(remaining);\n\n if (!match) {\n break;\n }\n\n const indent = match[1] || '';\n const matchIndex = searchStart + match.index;\n const contentStart = matchIndex + match[0].length;\n const closePattern = new RegExp(`^${indent}:::[ \\\\t]*$`, 'm');\n const afterMatch = content.slice(contentStart);\n const closeMatch = closePattern.exec(afterMatch);\n\n if (!closeMatch) {\n searchStart = contentStart;\n continue;\n }\n\n const yamlContent = afterMatch.slice(0, closeMatch.index);\n\n let data: PageContent;\n\n try {\n data = yamlLoad(yamlContent) as PageContent;\n } catch (error) {\n logger.warn(`Failed to parse page-constructor YAML in ${path}: ${error}`);\n searchStart = contentStart;\n continue;\n }\n\n if (!hasWhenConditions(data)) {\n searchStart = contentStart + closeMatch.index + closeMatch[0].length;\n continue;\n }\n\n const filtered = filterBlocksByConditions(data, vars, skipMissingVars);\n const hasBlocks = Array.isArray(filtered.blocks) && filtered.blocks.length > 0;\n\n const blockStart = matchIndex;\n const blockEnd = contentStart + closeMatch.index + closeMatch[0].length;\n\n if (hasBlocks) {\n const yaml = yamlDump(filtered, {\n lineWidth: -1,\n noRefs: true,\n quotingType: \"'\",\n forceQuotes: false,\n });\n\n const indentedYaml = yaml\n .split('\\n')\n .filter((line) => line.trim())\n .map((line) => `${indent}${line}`)\n .join('\\n');\n\n blocks.push({\n start: blockStart,\n end: blockEnd,\n replacement: `${indent}::: page-constructor\\n${indentedYaml}\\n${indent}:::\\n`,\n });\n } else {\n blocks.push({\n start: blockStart,\n end: blockEnd,\n replacement: '',\n });\n }\n\n searchStart = blockEnd;\n }\n\n for (let i = blocks.length - 1; i >= 0; i--) {\n const {start, end, replacement} = blocks[i];\n content = content.slice(0, start) + replacement + content.slice(end);\n }\n\n return content;\n}\n\nexport function resolveConditions(this: LoaderContext, content: string): string {\n const {skipMissingVars = false} = this.options;\n const vars = this.vars || {};\n\n content = processPageConstructorBlocks(content, {\n vars,\n skipMissingVars,\n logger: this.logger,\n path: this.path,\n });\n\n return content;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export * from './types';\n\nexport {getHooks} from './hooks';\nexport {MarkdownService} from './MarkdownService';\n", "import type {VFile} from '~/core/utils';\nimport type {Collect, Plugin} from './types';\nimport type {Meta} from '~/core/meta';\n\nimport {AsyncSeriesHook, AsyncSeriesWaterfallHook} from 'tapable';\n\nimport {generateHooksAccess} from '~/core/utils';\n\nexport function hooks(name: string) {\n return {\n Collects: new AsyncSeriesWaterfallHook<[Collect[]]>(['collects'], `${name}.Collects`),\n Plugins: new AsyncSeriesWaterfallHook<[Plugin[]]>(['plugins'], `${name}.Plugins`),\n Loaded: new AsyncSeriesHook<[string, DeepFrozen<Meta>, NormalizedPath]>(\n ['markdown', 'meta', 'path'],\n `${name}.Loaded`,\n ),\n Resolved: new AsyncSeriesHook<[string, NormalizedPath]>(\n ['markdown', 'path'],\n `${name}.Resolved`,\n ),\n Dump: new AsyncSeriesHook<VFile<string>>(['vfile'], `${name}.Dump`),\n };\n}\n\nconst [getHooks, withHooks] = generateHooksAccess('Markdown', hooks);\n\nexport {getHooks, withHooks};\n", "import type {Run as BaseRun} from '~/core/run';\nimport type {VarsService} from '~/core/vars';\nimport type {Meta, MetaService} from '~/core/meta';\nimport type {LoaderContext, TransformMode} from './loader';\nimport type {\n AssetInfo,\n Collect,\n EntryGraph,\n EntryInfo,\n GraphInfo,\n HeadingInfo,\n IncludeInfo,\n Location,\n Plugin,\n} from './types';\n\nimport {dirname, join} from 'node:path';\nimport {SourceMap} from '@diplodoc/liquid';\n\nimport {Buckets, Defer, Graph, VFile, all, bounded, fullPath, normalizePath} from '~/core/utils';\n\nimport {LoaderAPI, loader} from './loader';\nimport {getHooks, withHooks} from './hooks';\nimport {parseHeading} from './utils';\n\ntype MarkdownServiceConfig = {\n outputFormat: `${TransformMode}`;\n template: {\n enabled: boolean;\n keepNotVar: boolean;\n legacyConditions: boolean;\n features: {\n substitutions: boolean;\n conditions?: boolean | 'strict';\n };\n scopes: {\n code: boolean;\n };\n };\n preprocess?: {\n mergeSvg?: boolean;\n mergeIncludes?: boolean;\n hashIncludes?: boolean;\n mergeAutotitles?: boolean;\n };\n};\n\ntype Run = BaseRun<MarkdownServiceConfig> & {\n meta: MetaService;\n vars: VarsService;\n};\n\ntype Options = {\n mode: 'build' | 'translate';\n skipMissingVars: boolean;\n};\n\ninterface CacheItem {\n content: string;\n varsMetadata?: Hash;\n varsSystem?: Hash;\n meta: Meta;\n}\n\nfunction hash(path: NormalizedPath, from?: NormalizedPath) {\n return `${path}${from ? '+' + from : ''}`;\n}\n\nconst byLocation = (a: HeadingInfo, b: HeadingInfo) => a.location[0] - b.location[0];\n\n@withHooks\nexport class MarkdownService {\n readonly name = 'Markdown';\n\n get logger() {\n return this.run.logger;\n }\n\n get plugins() {\n return this._plugins.slice();\n }\n\n get collects() {\n return this._collects.slice();\n }\n\n get config() {\n return this.run.config;\n }\n\n private run: Run;\n\n private _collects: Collect[] = [];\n\n private _plugins: Plugin[] = [];\n\n private pathToMeta = new Buckets<Meta>();\n\n private pathToComments = new Buckets<Location[]>();\n\n private pathToDeps = new Buckets<IncludeInfo[]>();\n\n private pathToAssets = new Buckets<AssetInfo[]>();\n\n private pathToHeadings = new Buckets<HeadingInfo[]>();\n\n private pathToSourcemap = new Buckets<Record<number | string, string>>();\n\n private cache: Hash<Promise<CacheItem> | CacheItem> = {};\n\n private options;\n\n constructor(run: Run, options: Options = {mode: 'build', skipMissingVars: false}) {\n this.run = run;\n this.options = options;\n }\n\n @bounded async init() {\n this._collects = await getHooks(this).Collects.promise(this._collects);\n this._plugins = await getHooks(this).Plugins.promise(this._plugins);\n }\n\n @bounded async load(path: RelativePath, from?: NormalizedPath) {\n const file = normalizePath(path);\n const key = hash(file, from);\n\n if (key in this.cache) {\n const {content, varsMetadata, varsSystem, meta} = await this.cache[key];\n this.run.meta.addMetadata(file, varsMetadata);\n this.run.meta.addSystemVars(file, varsSystem);\n this.run.meta.add(file, meta, true);\n return content;\n }\n\n const defer = new Defer();\n\n this.cache[key] = defer.promise;\n\n try {\n const source = normalizePath(join(this.run.input, file)) as AbsolutePath;\n const raw = await this.run.read(source);\n const vars = this.run.vars.for(file, from);\n\n const context = this.loaderContext(file, raw, vars, this.proxy(key));\n const content = await loader.call(context, raw);\n\n // At this point all internal states are fully resolved.\n // So we don't expect Defer here.\n const meta = context.api.meta.get() as Meta;\n\n await getHooks(this).Loaded.promise(raw, meta, file);\n\n this.run.meta.addMetadata(file, vars.__metadata);\n this.run.meta.addSystemVars(file, vars.__system);\n this.run.meta.add(file, meta, true);\n\n const result = {\n content,\n varsMetadata: vars.__metadata,\n varsSystem: vars.__system,\n meta,\n };\n this.cache[key] = result;\n defer.resolve(result);\n\n // TODO: this may trigger uncaught exceptions\n // But if we move this two lines above, then program exits unexpectedly\n await getHooks(this).Resolved.promise(content, file);\n } catch (error) {\n defer.reject(error);\n }\n\n return (await defer.promise).content;\n }\n\n @bounded async dump(file: NormalizedPath, markdown?: string) {\n const vfile = new VFile<string, EntryInfo>(file, markdown || (await this.load(file)));\n\n vfile.info = {title: '', headings: []};\n\n await getHooks(this).Dump.promise(vfile);\n\n return vfile;\n }\n\n async meta(path: RelativePath) {\n return this._meta(normalizePath(path));\n }\n\n async deps(path: RelativePath) {\n return this._deps(normalizePath(path));\n }\n\n async graph(path: RelativePath) {\n return this._graph(normalizePath(path));\n }\n\n async relations(path: RelativePath) {\n return this._relations(normalizePath(path));\n }\n\n async assets(path: RelativePath) {\n return this._assets(normalizePath(path));\n }\n\n async headings(path: RelativePath) {\n return this._headings(normalizePath(path));\n }\n\n async titles(path: RelativePath) {\n const file = normalizePath(path);\n\n const titles: Hash<string> = {};\n\n try {\n const headings = await this.headings(file);\n const contents = headings.map(({content}) => content);\n\n for (const content of contents) {\n const {level, title, anchors} = parseHeading(content);\n\n if (level === 1 && !titles['#']) {\n titles['#'] = title;\n }\n\n for (const anchor of anchors) {\n titles[anchor] = title;\n }\n }\n } catch {\n // This is acceptable.\n // If this is a real file and someone depends on his titles,\n // then we throw exception in md plugin.\n }\n\n return titles;\n }\n\n @bounded async inspect(path: RelativePath, raw: string, vars: Hash) {\n const file = normalizePath(path);\n const api = new LoaderAPI();\n const context = this.loaderContext(file, raw, vars, api);\n const content = await loader.call(context, raw);\n\n const deps = api.deps.get();\n const assets = [...api.assets.get()];\n\n return {content, deps, assets};\n }\n\n remap(path: RelativePath, line: number): number {\n const file = normalizePath(path);\n const sourcemap = this.pathToSourcemap.get(file);\n\n if (!sourcemap) {\n return line;\n }\n\n return Number(sourcemap[line]) || line;\n }\n\n release(path: NormalizedPath, from?: NormalizedPath) {\n const key = hash(path, from);\n\n delete this.cache[key];\n this.pathToDeps.delete(key);\n this.pathToMeta.delete(key);\n this.pathToAssets.delete(key);\n this.pathToHeadings.delete(key);\n this.pathToComments.delete(key);\n this.pathToSourcemap.delete(key);\n }\n\n private async _meta(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n return this.pathToMeta.get(key);\n }\n\n private async _deps(file: NormalizedPath, from?: NormalizedPath): Promise<IncludeInfo[]> {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const deps = this.pathToDeps.get(key) || [];\n const internals: IncludeInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path}) => {\n return this._deps(path, from || file);\n }),\n );\n\n return deps.concat(...internals);\n }\n\n private async _graph(path: NormalizedPath, from?: NormalizedPath): Promise<EntryGraph> {\n const key = hash(path, from);\n\n const content = await this.load(path, from);\n const assets = this.pathToAssets.get(key) || [];\n const deps = await all(\n (this.pathToDeps.get(key) || []).map(async (dep) => {\n return {\n ...dep,\n ...(await this._graph(dep.path, from || path)),\n };\n }),\n );\n\n return {path, content, deps, assets};\n }\n\n private async _relations(\n path: NormalizedPath,\n from?: NormalizedPath,\n ): Promise<Graph<GraphInfo>> {\n const key = hash(path, from);\n const graph = new Graph<GraphInfo>();\n\n graph.addNode(path, {type: 'entry'});\n\n await this.load(path, from);\n await all(\n (this.pathToDeps.get(key) || []).map(async (dep) => {\n graph.consume(await this._relations(dep.path, from || path));\n graph.setNodeData(dep.path, {type: 'source'});\n graph.addDependency(path, dep.path);\n }),\n );\n\n (this.pathToAssets.get(key) || []).map(async (asset) => {\n if (['image', 'video'].includes(asset.type)) {\n graph.addNode(asset.path);\n graph.setNodeData(asset.path, {type: 'resource'});\n graph.addDependency(path, asset.path);\n }\n\n if (['link'].includes(asset.type) && asset.autotitle) {\n graph.addNode(asset.path);\n graph.setNodeData(asset.path, {type: 'source'});\n graph.addDependency(path, asset.path);\n }\n });\n\n const meta = this.run.meta.get(path);\n const resources = ([] as string[]).concat(meta.script || [], meta.style || []);\n for (const resource of resources) {\n const file = normalizePath(join(dirname(path), resource));\n graph.addNode(file);\n graph.setNodeData(file, {type: 'resource'});\n graph.addDependency(path, file);\n }\n\n return graph;\n }\n\n private async _assets(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const assets = this.pathToAssets.get(key) || [];\n const internals: AssetInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path}) => {\n return this._assets(path, from || file);\n }),\n );\n\n return assets.concat(...internals);\n }\n\n private async _headings(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const headings = this.pathToHeadings.get(key) || [];\n const internals: HeadingInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path, location}) => {\n const headings = await this._headings(path, from || file);\n return headings.map((heading) => ({...heading, location}));\n }),\n );\n\n return headings.concat(...internals).sort(byLocation);\n }\n\n private proxy(key: string) {\n return {\n deps: this.pathToDeps.bind(key),\n assets: this.pathToAssets.bind(key),\n meta: this.pathToMeta.bind(key),\n comments: this.pathToComments.bind(key),\n headings: this.pathToHeadings.bind(key),\n sourcemap: this.pathToSourcemap.bind(key),\n };\n }\n\n private loaderContext(\n path: NormalizedPath,\n raw: string,\n vars: Hash,\n api?: Partial<LoaderAPI>,\n ): LoaderContext {\n return {\n path,\n vars,\n logger: this.logger,\n readFile: (path: RelativePath) => {\n return this.run.read(join(this.run.input, path));\n },\n emitFile: async (file: NormalizedPath, content: string) => {\n const rootPath = fullPath(file, path);\n await this.run.write(join(this.run.input, rootPath), content, true);\n },\n fullPath: (path: RelativePath) => join(this.run.input, path),\n input: this.run.input,\n api: new LoaderAPI(api),\n collects: this.collects,\n sourcemap: new SourceMap(raw),\n settings: {\n substitutions: this.config.template.features.substitutions,\n conditions:\n typeof this.config.template.features.conditions === 'string'\n ? (this.config.template.features.conditions as 'strict')\n : Boolean(this.config.template.features.conditions),\n conditionsInCode: this.config.template.scopes.code,\n keepNotVar: this.config.template.keepNotVar,\n legacyConditions: this.config.template.legacyConditions,\n keepConditionSyntaxOnTrue: this.options.mode === 'translate',\n },\n options: {\n disableLiquid: !this.config.template.enabled,\n mergeContentParts: this.config.preprocess?.mergeSvg ?? false,\n skipMissingVars: this.options.skipMissingVars,\n },\n mode: this.options.mode,\n };\n }\n}\n", "import type {LiquidContext, SourceMap} from '@diplodoc/liquid';\nimport type {Meta} from '~/core/meta';\nimport type {Logger} from '~/core/logger';\nimport type {Bucket} from '~/core/utils';\nimport type {AssetInfo, Collect, HeadingInfo, IncludeInfo, Location} from './types';\n\nimport {merge} from 'lodash';\n\nimport {bucket} from '~/core/utils';\n\nimport {mangleFrontMatter} from './loader/mangle-frontmatter';\nimport {templateContent} from './loader/template-content';\nimport {resolveComments} from './loader/resolve-comments';\nimport {resolveDependencies} from './loader/resolve-deps';\nimport {resolveAssets} from './loader/resolve-assets';\nimport {resolveHeadings} from './loader/resolve-headings';\nimport {resolveNoTranslate} from './loader/resolve-no-translate';\nimport {resolveBlockCodes} from './loader/resolve-code';\nimport {resolveConditions} from './loader/resolve-conditions';\n\nexport enum TransformMode {\n Html = 'html',\n Md = 'md',\n}\n\nexport class LoaderAPI {\n blockCodes: Bucket<Location[]>;\n comments: Bucket<Location[]>;\n deps: Bucket<IncludeInfo[]>;\n assets: Bucket<AssetInfo[]>;\n meta: Bucket<Meta>;\n headings: Bucket<HeadingInfo[]>;\n sourcemap: Bucket<Record<number | string, string>>;\n\n constructor(proxy: Partial<LoaderAPI> = {}) {\n this.blockCodes = proxy.blockCodes || bucket();\n this.deps = proxy.deps || bucket();\n this.assets = proxy.assets || bucket();\n this.meta = proxy.meta || bucket();\n this.comments = proxy.comments || bucket();\n this.headings = proxy.headings || bucket();\n this.sourcemap = proxy.sourcemap || bucket();\n }\n}\n\nexport type LoaderContext = LiquidContext & {\n path: NormalizedPath;\n vars: Hash;\n logger: Logger;\n emitFile(path: NormalizedPath, content: string): Promise<void>;\n readFile(path: NormalizedPath): Promise<string>;\n fullPath(path: RelativePath): AbsolutePath;\n input: AbsolutePath;\n collects: Collect[];\n api: LoaderAPI;\n sourcemap: SourceMap;\n options: {\n disableLiquid: boolean;\n mergeContentParts: boolean;\n skipMissingVars?: boolean;\n };\n mode: 'build' | 'translate';\n};\n\nexport async function loader(this: LoaderContext, content: string) {\n content = mangleFrontMatter.call(this, content);\n content = resolveNoTranslate.call(this, content);\n content = templateContent.call(this, content);\n content = resolveConditions.call(this, content);\n content = await applyCollectPlugins.call(this, content);\n content = resolveBlockCodes.call(this, content);\n content = resolveComments.call(this, content);\n content = resolveDependencies.call(this, content);\n content = resolveAssets.call(this, content);\n content = resolveHeadings.call(this, content);\n\n this.api.sourcemap.set(this.sourcemap.dump());\n\n return content;\n}\n\nasync function applyCollectPlugins(this: LoaderContext, content: string) {\n let meta = {};\n\n for (const collect of this.collects) {\n let result = await collect.call(this, content, {});\n\n if (Array.isArray(result)) {\n meta = merge(meta, result[1] || {});\n result = result[0] as string;\n }\n\n if (result !== undefined) {\n content = result as string;\n }\n }\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nimport {extractFrontMatter, liquidJson} from '@diplodoc/liquid';\n\ntype YamlErrorMark = {\n line?: number;\n};\n\ntype YamlError = {\n reason?: string;\n mark?: YamlErrorMark;\n};\n\nfunction safeExtractFrontmatter(this: LoaderContext, content: string) {\n try {\n return extractFrontMatter(content);\n } catch (error) {\n const err = error as YamlError;\n if (err.reason === 'duplicated mapping key') {\n const line = typeof err.mark?.line === 'number' ? err.mark.line + 1 : undefined;\n const key = line === undefined ? '' : content.split('\\n')[line]?.trim().split(':')[0];\n\n if (key && key !== 'vcsPath') {\n const context = `[Reason: \"${err.reason}\"; Line: ${line}; Key: \"${key}\"]`;\n const errorMessage = `${this.path}: ${line}: YFM017 / invalid front matter format ${context}`;\n\n this.logger.error(errorMessage);\n }\n }\n return extractFrontMatter(content, {json: true});\n }\n}\n\nexport function mangleFrontMatter(this: LoaderContext, rawContent: string) {\n const {vars, options} = this;\n const {disableLiquid} = options;\n\n const [frontmatter, content, rawFrontmatter] = safeExtractFrontmatter.call(this, rawContent);\n\n if (!rawFrontmatter) {\n this.api.meta.set({});\n return rawContent;\n }\n\n if (disableLiquid) {\n this.api.meta.set(frontmatter);\n } else {\n this.api.meta.set(liquidJson.call(this, frontmatter, vars));\n }\n\n this.sourcemap.delete(1, rawFrontmatter);\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nimport {liquidDocument, liquidSnippet} from '@diplodoc/liquid';\n\nexport function templateContent(this: LoaderContext, rawContent: string) {\n const {vars, options} = this;\n const {disableLiquid} = options;\n\n if (disableLiquid) {\n return rawContent;\n }\n\n let content;\n\n if (this.mode === 'translate') {\n content = liquidDocument.call(this, rawContent, vars);\n } else {\n content = liquidSnippet.call(this, rawContent, vars, this.sourcemap);\n }\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nexport function resolveComments(this: LoaderContext, content: string) {\n const COMMENTS_CONTENTS = /<!-{2,}[\\s\\S]*?-{2,}>/g;\n const comments = [];\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = COMMENTS_CONTENTS.exec(content))) {\n comments.push([match.index, COMMENTS_CONTENTS.lastIndex] as [number, number]);\n }\n\n this.api.comments.set(comments);\n\n return content;\n}\n", "import type {IncludeInfo} from '../types';\nimport type {LoaderContext} from '../loader';\n\nimport {dirname, join} from 'node:path';\n\nimport {normalizePath, parseLocalUrl, rebasePath} from '~/core/utils';\n\nimport {filterRanges, findLink} from '../utils';\n\nexport function resolveDependencies(this: LoaderContext, content: string) {\n const includes = [];\n const exclude = [...this.api.comments.get()];\n\n // Include example: {% include [createfolder](create-folder.md) %}\n // Regexp result: [createfolder](create-folder.md)\n const INCLUDE_CONTENTS = /{%\\s*include\\s*.+?%}/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = INCLUDE_CONTENTS.exec(content))) {\n // Ugly workaround for include examples\n // TODO: rewrite all inspect code on markdown-it parsing with minimal set of plugins\n if (content[match.index - 1] === '`') {\n continue;\n }\n\n const link = findLink(match[0]) as string;\n // TODO: warn about non local urls\n const include = parseLocalUrl<IncludeInfo>(link);\n\n if (include && include.path) {\n const currentPath = this.path;\n const normalizedIncludePath = normalizePath(join(dirname(currentPath), include.path));\n\n if (normalizedIncludePath === currentPath) {\n this.logger.error('YFM016', `${currentPath}: The file is included in itself`);\n\n continue;\n }\n\n include.path = rebasePath(currentPath, include.path as RelativePath);\n include.link = link;\n include.match = content.slice(match.index, INCLUDE_CONTENTS.lastIndex);\n include.location = [match.index, INCLUDE_CONTENTS.lastIndex];\n\n includes.push(include);\n }\n }\n\n this.api.deps.set(filterRanges(exclude, includes));\n\n return content;\n}\n", "import type {AssetInfo, ImageOptions, Location} from './types';\nimport type {ConstructorBlock, PageContent} from '@diplodoc/page-constructor-extension';\n\nimport {load as yamlLoad} from 'js-yaml';\n\nimport {MEDIA_FORMATS, parseLocalUrl, walkLinks} from '~/core/utils';\n\ntype AssetModifier = '!' | '@' | '';\n\nconst modifiers = {'!': 'image', '@': 'video', '': 'link'} as const;\n\nexport function findLink(content: string): string | undefined {\n const rx = /]\\(\\s*/g;\n const match = rx.exec(content);\n if (!match) {\n return undefined;\n }\n\n const link = parseLinkDestination(content, rx.lastIndex);\n\n if (link === null || link.match(/[${}]/)) {\n return undefined;\n }\n\n rx.lastIndex += link.length + 1;\n\n return link;\n}\n\nexport function extractImages(block: ConstructorBlock | string): string[] {\n const images: string[] = [];\n\n if (!block) {\n return images;\n }\n\n if (typeof block === 'string') {\n const trimmedBlock = block.trim();\n\n if (MEDIA_FORMATS.test(trimmedBlock) && trimmedBlock.split(/\\s+/).length === 1) {\n images.push(trimmedBlock);\n }\n\n return images;\n }\n\n walkLinks(block, (value) => {\n if (MEDIA_FORMATS.test(value) && value.split(/\\s+/).length === 1) {\n images.push(value);\n }\n });\n\n return images;\n}\n\nexport function parsePcBlocks(blocks: ConstructorBlock[] = [], images: string[] = []): string[] {\n for (const block of blocks) {\n images.push(...extractImages(block));\n }\n\n return images;\n}\n\nexport function getPcIconTitle(iconPath: string): string {\n const file = iconPath.split('/').pop() || iconPath;\n\n return file.replace(/\\.[^.]+$/, '');\n}\n\nexport const PC_REGEX = /^([ \\t]*):::\\s*page-constructor[ \\t]*\\r?\\n?/m;\n\nexport function findPcImages(content: string): AssetInfo[] {\n const pcImages: AssetInfo[] = [];\n const openRegex = new RegExp(PC_REGEX.source, PC_REGEX.flags);\n\n let searchStart = 0;\n\n while (searchStart < content.length) {\n const remaining = content.slice(searchStart);\n const match = openRegex.exec(remaining);\n\n if (!match) {\n break;\n }\n\n const indent = match[1] || '';\n const matchIndex = searchStart + match.index;\n const startIdx = matchIndex + match[0].length;\n const closeRegex = new RegExp(`^${indent}:::[ \\\\t]*$`, 'm');\n const afterMatch = content.slice(startIdx);\n const closeMatch = closeRegex.exec(afterMatch);\n\n if (!closeMatch) {\n searchStart = startIdx;\n continue;\n }\n\n const rawBlock = afterMatch.slice(0, closeMatch.index);\n let data: PageContent;\n\n try {\n data = yamlLoad(rawBlock) as PageContent;\n } catch {\n searchStart = startIdx;\n continue;\n }\n\n const images = parsePcBlocks(data?.blocks as ConstructorBlock[], []);\n\n for (const img of images) {\n const parsed = parseLocalUrl(img);\n\n if (!parsed) {\n continue;\n }\n\n const blockEnd = startIdx + closeMatch.index + closeMatch[0].length;\n\n pcImages.push({\n ...parsed,\n type: 'image',\n subtype: 'image',\n title: getPcIconTitle(img),\n autotitle: false,\n hash: null,\n search: null,\n location: [matchIndex, blockEnd],\n // no inline svg inside page-constructor because we hasn't a location for asset\n options: {width: undefined, height: undefined, inline: false},\n });\n }\n\n searchStart = startIdx + closeMatch.index + closeMatch[0].length;\n }\n\n return pcImages;\n}\n\nexport function findLinksInfo(content: string): AssetInfo[] {\n const links = find(/]\\(\\s*/g, content, (match, rx) => {\n const link = parseLinkDestination(content, rx.lastIndex);\n const title = parseLinkTitle(content, rx.lastIndex - match[0].length);\n const options = parseLinkOptions(content, rx.lastIndex + (link?.length || 0) + 1);\n\n // TODO: add more precise filter for unix compatible paths\n if (link === null || title === null || link.match(/[${}]/)) {\n return undefined;\n }\n\n const parsed = parseLocalUrl(link);\n if (!parsed) {\n return undefined;\n }\n\n const modifier = content[\n rx.lastIndex - match[0].length - title.length - 2\n ] as AssetModifier;\n const type = modifiers[modifier] || 'link';\n\n rx.lastIndex += link.length + 1;\n\n return {\n ...parsed,\n type,\n subtype: type === 'image' ? 'image' : null,\n title,\n autotitle: type === 'link' && (!title || title === '{#T}'),\n options,\n };\n });\n\n const referenceLinks = find(/]\\[\\s*/g, content, (match, rx) => {\n let link = parseLinkDestination(content, rx.lastIndex, ['[', ']']);\n let title = parseLinkTitle(content, rx.lastIndex - match[0].length);\n const options = parseLinkOptions(content, rx.lastIndex + (link?.length || 0) + 1);\n\n // TODO: add more precise filter for unix compatible paths\n if ((link === null && title === null) || link?.match(/[${}]/)) {\n return undefined;\n }\n title = title || '';\n link = link || title;\n\n const parsed = parseLocalUrl(link);\n if (!parsed) {\n return undefined;\n }\n\n const modifier = content[\n rx.lastIndex - match[0].length - title.length - 2\n ] as AssetModifier;\n const type = modifiers[modifier] || 'link';\n\n rx.lastIndex += (content[rx.lastIndex] === ']' ? 0 : link.length) + 1;\n\n return {\n ...parsed,\n type,\n subtype: 'reference',\n code: link,\n title,\n autotitle: type === 'link' && (!title || title === '{#T}'),\n options,\n };\n });\n\n return [...links, ...referenceLinks];\n}\n\nexport function findDefs(content: string): AssetInfo[] {\n return find(/^\\s*\\[(.*?)]:\\s*([^\\s]+)/gm, content, (match) => {\n const parsed = parseLocalUrl(match[2]);\n if (!parsed) {\n return undefined;\n }\n\n return {\n ...parsed,\n type: 'def',\n code: match[1] || undefined,\n title: '',\n autotitle: true,\n };\n });\n}\n\nfunction find(\n matcher: RegExp,\n content: string,\n map: (match: RegExpMatchArray, rx: RegExp) => Omit<AssetInfo, 'location'> | void,\n): AssetInfo[] {\n const links: AssetInfo[] = [];\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = matcher.exec(content))) {\n const result = map(match, matcher);\n if (!result) {\n continue;\n }\n\n if (result) {\n links.push({\n ...result,\n location: [match.index, matcher.lastIndex],\n });\n }\n }\n\n return links;\n}\n\nfunction parseLinkDestination(str: string, start: number, symbols = ['(', ')']) {\n const max = str.length;\n const [symbolStart, symbolEnd] = symbols.map((symbol) => symbol.charCodeAt(0));\n\n let code,\n level = 0,\n pos = start;\n\n if (str.charCodeAt(pos) === 0x3c /* < */) {\n return parseSimpleLink(str, start + 1);\n }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x20) {\n break;\n }\n\n // ascii control characters\n if (code < 0x20 || code === 0x7f) {\n break;\n }\n\n if (code === 0x5c /* \\ */ && pos + 1 < max) {\n if (str.charCodeAt(pos + 1) === 0x20) {\n break;\n }\n pos += 2;\n continue;\n }\n\n if (code === symbolStart /* ( or [ */) {\n level++;\n if (level > 32) {\n return null;\n }\n }\n\n if (code === symbolEnd /* ) or ] */) {\n if (level === 0) {\n break;\n }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos) {\n return null;\n }\n if (level !== 0) {\n return null;\n }\n\n return str.slice(start, pos);\n}\n\nfunction parseLinkTitle(str: string, start: number) {\n let code,\n prev,\n level = 0,\n pos = start;\n\n while (pos >= 0) {\n code = str.charCodeAt(pos);\n prev = str.charCodeAt(pos - 1);\n\n // ascii control characters\n if (code < 0x20 || code === 0x7f) {\n break;\n }\n\n if (prev === 0x5c /* \\ */) {\n pos -= 2;\n continue;\n }\n\n if (code === 93 /* ] */) {\n level++;\n if (level > 32) {\n return null;\n }\n }\n\n if (code === 91 /* [ */) {\n if (level === 1) {\n break;\n }\n level--;\n }\n\n pos--;\n }\n\n return str.slice(pos + 1, start);\n}\n\nfunction parseLinkOptions(str: string, start: number): ImageOptions {\n const max = str.length;\n const options: ImageOptions = {\n width: undefined,\n height: undefined,\n inline: undefined,\n };\n let code,\n level = 0,\n pos = start,\n startOption = start;\n\n if (str[pos - 1] !== ')') {\n level--;\n }\n if (str.charCodeAt(pos) !== 0x7b /* { */ && level === 0) {\n return options;\n }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x29 /* ) */ && level === -1) {\n if (str.charCodeAt(pos + 1) !== 0x7b) {\n return options;\n }\n level++;\n }\n\n if (code === 0x7b /* { */ && level > -1) {\n level++;\n startOption = pos + 1;\n if (level > 32) {\n return options;\n }\n }\n\n if (code === 0x7d /* } */) {\n if (level === 1) {\n level--;\n break;\n }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos || level !== 0) {\n return options;\n }\n\n const attrRegex = /(\\w+)=(?:'([^']*)'|\"([^\"]*)\"|(\\S+))/g;\n const optionsString = str.slice(startOption, pos);\n let match;\n\n while ((match = attrRegex.exec(optionsString)) !== null) {\n const key = match[1] as keyof ImageOptions;\n const value = match[2] || match[3] || match[4];\n\n if (key === 'inline') {\n options[key] = value === 'true';\n } else {\n options[key] = value;\n }\n }\n\n return options;\n}\n\nfunction parseSimpleLink(str: string, start: number) {\n const max = str.length;\n\n let code,\n pos = start;\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === 0x0a /* \\n */) {\n return null;\n }\n if (code === 0x3c /* < */) {\n return null;\n }\n if (code === 0x3e /* > */) {\n return str.slice(start, pos);\n }\n if (code === 0x5c /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n pos++;\n }\n\n // no closing '>'\n return null;\n}\n\nexport function filterRanges<T extends {location: Location}>(\n excludes: Location[],\n infos: T[],\n): T[] {\n const contains = (exclude: Location, point: Location) => {\n return (\n (exclude[1] >= point[0] && exclude[1] <= point[1]) ||\n (exclude[0] >= point[0] && exclude[0] < point[1]) ||\n (exclude[0] < point[0] && exclude[1] >= point[1])\n );\n };\n\n return infos.filter((item) => {\n return !excludes.some((exclude) => contains(exclude, item.location));\n });\n}\n\nexport function parseHeading(content: string) {\n const anchors = [];\n const commonHeading = content.match(/^#+/);\n const alternateHeading = content[content.length - 1];\n const alternaleLevels = ['-', '='];\n const level = commonHeading\n ? commonHeading[0].length\n : alternaleLevels.indexOf(alternateHeading) + 1;\n\n if (commonHeading) {\n content = content.replace(/^#+\\s*/, '');\n } else {\n content = content.replace(/\\n[-=]+$/, '');\n }\n\n const ANCHOR = /[^[]{(#[^}]+)}/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = ANCHOR.exec(content))) {\n anchors.push(match[1]);\n content = content.replace(match[0], '');\n ANCHOR.lastIndex -= match[0].length;\n }\n\n const title = content.trim();\n\n return {anchors, title, level};\n}\n", "import type {LoaderContext} from '../loader';\nimport type {AssetInfo} from '../types';\n\nimport {join} from 'node:path';\n\nimport {fs, normalizePath, rebasePath} from '~/core/utils';\n\nimport {filterRanges, findDefs, findLinksInfo, findPcImages} from '../utils';\n\nfunction fixUnreachableLink(path: RelativePath, loaderContext: LoaderContext) {\n let newPath = path;\n const pathnameParts = normalizePath(path).split('/');\n const relativePartsCount = pathnameParts.filter((part: string) => part === '..').length;\n let includedFilePath;\n\n for (let i = 0; i <= relativePartsCount; i++) {\n try {\n includedFilePath = normalizePath(\n join(loaderContext.input, pathnameParts.slice(i).join('/')),\n );\n fs.realpathSync(includedFilePath);\n if (i > 0) {\n newPath = normalizePath(pathnameParts.slice(i).join('/'));\n loaderContext.logger.error(`Path was fixed from ${path} \n to ${newPath}`);\n }\n return newPath;\n } catch {\n if (i === relativePartsCount - 1) {\n return newPath;\n } else {\n continue;\n }\n }\n }\n return newPath;\n}\n\nfunction getSize(\n path: RelativePath,\n loaderContext: LoaderContext,\n assetSizes: Map<RelativePath, number>,\n) {\n if (path === null) {\n return 0;\n }\n if (assetSizes.has(path)) {\n return assetSizes.get(path) as number;\n }\n\n try {\n const fixedPath = fixUnreachableLink(path, loaderContext);\n const fullPath = loaderContext.fullPath(fixedPath);\n const size = fs.statSync(fullPath).size;\n assetSizes.set(path, size);\n return size;\n } catch {\n assetSizes.set(path, 0);\n return 0;\n }\n}\n\nexport function resolveAssets(this: LoaderContext, content: string) {\n const assets: AssetInfo[] = [];\n const assetSizes = new Map<RelativePath, number>();\n\n const exclude = [\n ...this.api.deps.get().map(({location}) => location),\n ...this.api.comments.get(),\n ...this.api.blockCodes.get(),\n ];\n\n const defs = filterRanges(exclude, findDefs(content));\n const links = filterRanges(exclude, findLinksInfo(content));\n const pcImages = filterRanges(exclude, findPcImages(content));\n\n for (const info of [...defs, ...links, ...pcImages]) {\n try {\n if (info.path !== null && !info.path?.startsWith('*') && !info.path?.includes('%')) {\n info.path = rebasePath(this.path, decodeURIComponent(info.path) as RelativePath);\n }\n\n let size = 0;\n if (['def', 'image'].includes(info.type) && info.subtype === 'image') {\n size = getSize(info.path, this, assetSizes);\n }\n\n assets.push({...info, size});\n } catch (error) {\n this.logger.warn(`Error processing asset from ${this.path} to ${info.path}: ${error}`);\n }\n }\n\n this.api.assets.set([...assets]);\n\n return content;\n}\n", "import type {Location} from '../types';\nimport type {LoaderContext} from '../loader';\n\nimport {filterRanges} from '../utils';\n\nexport function resolveHeadings(this: LoaderContext, content: string) {\n const headings = [];\n const exclude = [...this.api.comments.get()];\n\n const heading = /(?<=^|\\n)([#=-])/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = heading.exec(content))) {\n const [result, location] =\n match[1] === '#'\n ? findCommonHeading(match.index, content)\n : findAlternateHeading(match.index, content);\n\n if (result) {\n headings.push({content: result, location});\n heading.lastIndex = location[1];\n }\n }\n\n this.api.headings.set(filterRanges(exclude, headings));\n\n return content;\n}\n\nconst SPACE = /[ \\t]/;\n\nfunction findCommonHeading(start: number, content: string): [string, Location] | never[] {\n let title = '';\n\n let index = start;\n while (index < content.length) {\n if (index - start > 6) {\n return [];\n }\n\n if (content[index] === '#') {\n index++;\n } else if (content[index].match(SPACE)) {\n break;\n } else {\n return [];\n }\n }\n\n while (index < content.length) {\n if (content[index + 1] && content[index] !== '\\n') {\n title += content[index];\n index++;\n } else if (title.trim()) {\n return [content.slice(start, index), [start, index]];\n } else {\n return [];\n }\n }\n\n return [];\n}\n\nfunction findAlternateHeading(start: number, content: string): [string, Location] | never[] {\n const delim = content[start];\n const newline = [];\n\n let title = '';\n\n let end = start;\n while (end < content.length) {\n if (content[end] === delim) {\n end++;\n } else if (content[end] === '\\n' || !content[end + 1]) {\n break;\n } else {\n return [];\n }\n }\n\n let index = start - 1;\n while (index >= 0) {\n const isContentStart = !index;\n const isTitleStart = newline.length === 2 && !content.slice(...newline).trim();\n\n if (newline.length && !isTitleStart) {\n newline.length = 1;\n }\n\n if (!isTitleStart) {\n title = content[index] + title;\n }\n\n if (isContentStart || isTitleStart) {\n const clean = title.trimStart();\n if (clean) {\n return [content.slice(start - clean.length, end), [start - clean.length, end]];\n } else {\n return [];\n }\n }\n\n if (content[index] === '\\n') {\n newline.unshift(index);\n }\n\n index--;\n }\n\n return [];\n}\n", "import type {LoaderContext} from '../loader';\n\nexport function resolveNoTranslate(this: LoaderContext, content: string) {\n if (this.mode === 'translate') {\n return content;\n }\n\n content = resolveContainerDirectives(content);\n\n content = resolveLeafBlockDirectives(content);\n\n content = resolveInlineDirectives(content);\n\n return content;\n}\n\nfunction resolveContainerDirectives(content: string): string {\n const lines = content.split('\\n');\n const result = [];\n\n const stack = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.trim().startsWith(':::')) {\n const directiveLine = line.trim();\n\n if (directiveLine === ':::') {\n if (stack.length > 0) {\n const lastDirective = stack.pop();\n\n if (lastDirective === 'no-translate' && stack.length === 0) {\n continue;\n }\n\n result.push(line);\n }\n } else {\n const directiveMatch = directiveLine.match(/^:::\\s*([^\\s]+)/);\n const directiveName = directiveMatch ? directiveMatch[1] : '';\n\n if (directiveName === 'no-translate') {\n stack.push('no-translate');\n continue;\n } else {\n stack.push(directiveName);\n result.push(line);\n }\n }\n } else {\n result.push(line);\n }\n }\n\n return result.join('\\n');\n}\n\nfunction resolveLeafBlockDirectives(content: string): string {\n const blockRegex = /::\\s*no-translate\\s*\\[([\\s\\S]*?)\\]/g;\n\n return content.replace(blockRegex, (_, innerContent) => {\n return innerContent;\n });\n}\n\nfunction resolveInlineDirectives(content: string): string {\n const inlineRegex = /(?<![:]):no-translate\\s*\\[([\\s\\S]*?)\\]/g;\n\n return content.replace(inlineRegex, (_, innerContent) => {\n return innerContent;\n });\n}\n", "import type {LoaderContext} from '../loader';\nimport type Token from 'markdown-it/lib/token';\n\nimport MarkdownIt from 'markdown-it';\n// @ts-ignore\nimport deflist from 'markdown-it-deflist';\nimport imsize from '@diplodoc/transform/lib/plugins/imsize';\nimport yfmTable from '@diplodoc/transform/lib/plugins/table';\n\nfunction computeLineStarts(lines: string[]): number[] {\n const lineStarts: number[] = [0];\n for (let i = 1; i < lines.length; i++) {\n const lineEndingLength = 1; //lines[i - 1].endsWith('\\r') ? 2 : 1;\n lineStarts[i] = lineStarts[i - 1] + lines[i - 1].length + lineEndingLength;\n }\n return lineStarts;\n}\n\nconst lineToCharPosition = (line: number, lineStarts: number[], content: string): number =>\n line >= lineStarts.length ? content.length : lineStarts[line];\n\nfunction calculateAdjustedEnd(\n endLine: number,\n lineStarts: number[],\n lines: string[],\n content: string,\n): number {\n let end = content.length;\n if (endLine <= lineStarts.length) {\n end = endLine === 0 ? 0 : lineStarts[endLine - 1] + lines[endLine - 1].length;\n }\n return endLine <= lines.length && endLine > 0 ? end + 1 : end;\n}\n\n// Process block code tokens (fence and code_block)\nfunction processBlockCode(\n token: Token,\n lineStarts: number[],\n lines: string[],\n content: string,\n codes: Array<[number, number]>,\n) {\n if (!token.map || token.map.length !== 2) {\n return;\n }\n\n const [startLine, endLine] = token.map;\n\n const start = lineToCharPosition(startLine, lineStarts, content);\n\n let adjustedEnd: number;\n if (token.type === 'fence' && endLine <= lines.length) {\n const endLineContent = lines[endLine - 1] || '';\n const fenceEndIndex = endLineContent.indexOf(token.markup);\n if (fenceEndIndex > -1) {\n const lineStart = lineStarts[endLine - 1] || 0;\n const fenceEndPos = lineStart + fenceEndIndex + token.markup.length;\n adjustedEnd = fenceEndPos;\n } else {\n adjustedEnd = calculateAdjustedEnd(endLine, lineStarts, lines, content);\n }\n } else {\n adjustedEnd = calculateAdjustedEnd(endLine, lineStarts, lines, content);\n }\n\n codes.push([start, adjustedEnd]);\n}\n\n// Check specific attribute in image part\nfunction checkAttribute(\n imagePart: string,\n matchStart: number,\n codeText: string | null,\n start: number | undefined,\n end: number | undefined,\n regex: RegExp,\n getAttrStart: (matchStart: number, imagePart: string) => number,\n): boolean {\n const match = imagePart.match(regex);\n if (match) {\n if (codeText !== null) {\n // Check if code text is in attributes\n if (match[1].includes(codeText)) {\n return true;\n }\n } else if (start !== undefined && end !== undefined) {\n // Check if code range falls within attributes\n const attrStart = getAttrStart(matchStart, imagePart);\n const attrEnd = attrStart + match[0].length;\n if (start >= attrStart && end <= attrEnd) {\n return true;\n }\n }\n }\n return false;\n}\n\n// Check attributes in image part\nfunction checkImageAttributes(\n imagePart: string,\n matchStart: number,\n codeText: string | null,\n start?: number,\n end?: number,\n): {braceMatch: boolean; quoteMatch: boolean} {\n // Check attributes in curly braces {...}\n const braceMatch = checkAttribute(\n imagePart,\n matchStart,\n codeText,\n start,\n end,\n /\\s*{([^}]*)}/,\n (matchStart, imagePart) => matchStart + imagePart.indexOf('{'),\n );\n\n // Check title attribute in quotes \"...\"\n const quoteMatch = checkAttribute(\n imagePart,\n matchStart,\n codeText,\n start,\n end,\n /\\s*\"([^\"]*)\"/,\n (matchStart, imagePart) => matchStart + imagePart.indexOf('\"'),\n );\n\n return {braceMatch, quoteMatch};\n}\n\n// Add code to array and update position\nfunction addCodeAndUpdatePosition(\n startIndex: number,\n endIndex: number,\n content: string,\n codes: Array<[number, number]>,\n parentStartPos: number,\n lines: string[],\n): number {\n // Check if this code is inside image attributes\n const insideAttrs = isInsideImageAttributes(content, startIndex, endIndex, lines);\n if (!insideAttrs) {\n codes.push([startIndex, endIndex]);\n }\n\n // Update parentStartPos to avoid finding the same match again\n return insideAttrs ? parentStartPos : Math.max(parentStartPos, endIndex);\n}\n\n// Process inline code tokens\nfunction processInlineCode(\n token: Token,\n content: string,\n parentStartPos: number,\n codes: Array<[number, number]>,\n lineStarts: number[],\n lines: string[],\n): number {\n if (!token.markup || !token.content) {\n return parentStartPos;\n }\n\n // Use token's position information if available\n if (token.map && token.map.length === 2) {\n const [startLine, _endLine] = token.map;\n const start = lineToCharPosition(startLine, lineStarts, content);\n\n // Find the exact position of the inline code within the line\n const lineContent = lines[startLine] || '';\n const searchPattern = token.markup + token.content + token.markup;\n const patternIndex = lineContent.indexOf(searchPattern);\n\n if (patternIndex !== -1) {\n const startIndex = start + patternIndex;\n const endIndex = startIndex + searchPattern.length;\n\n return addCodeAndUpdatePosition(\n startIndex,\n endIndex,\n content,\n codes,\n parentStartPos,\n lines,\n );\n }\n } else {\n const searchPattern = token.markup + token.content + token.markup;\n const startIndex = content.indexOf(searchPattern, parentStartPos);\n\n if (startIndex !== -1) {\n const endIndex = startIndex + searchPattern.length;\n\n return addCodeAndUpdatePosition(\n startIndex,\n endIndex,\n content,\n codes,\n parentStartPos,\n lines,\n );\n }\n }\n\n return parentStartPos;\n}\n\n// Function to check if code is inside image attributes\nfunction isInsideImageAttributes(\n content: string,\n start: number,\n end: number,\n lines: string[],\n): boolean {\n // Limit regex search to a smaller window around the code for better performance\n const windowSize = 200; // Reduced window size for better performance\n const checkStart = Math.max(0, start - windowSize);\n const checkEnd = Math.min(content.length, end + windowSize);\n const contentWindow = content.substring(checkStart, checkEnd);\n\n // Only search for images in the limited window\n const imageRegex = /!\\[[^\\]]*\\]\\([^)]*\\)(?:\\s*\"[^\"]*\")?(?:\\s*{[^}]*})?/g;\n\n let match;\n while ((match = imageRegex.exec(contentWindow)) !== null) {\n // Adjust positions to global content positions\n const matchStart = match.index + checkStart;\n const matchEnd = matchStart + match[0].length;\n\n // Check if code range falls within this image\n if (start >= matchStart && end <= matchEnd) {\n // Check if code is in attributes\n const imagePart = match[0];\n // Adjust positions relative to the image part\n const relativeStart = start - matchStart;\n const relativeEnd = end - matchStart;\n const {braceMatch, quoteMatch} = checkImageAttributes(\n imagePart,\n matchStart,\n null,\n relativeStart,\n relativeEnd,\n );\n if (braceMatch || quoteMatch) {\n return true;\n }\n }\n }\n\n // Additional check: if code is in attributes of any image in the document,\n // then it should not be marked as code block\n const codeContent = content.substring(start, end);\n const codeText = codeContent.replace(/`/g, ''); // Remove backticks\n // TODO:goldserg not optimized block (increase time at 6 times)\n // Find all images in the document\n const allImagesRegex = /!\\[[^\\]]*\\]\\([^)]*\\)(?:\\s*\"[^\"]*\")?(?:\\s*{[^}]*})?/gs;\n let imageMatch;\n while ((imageMatch = allImagesRegex.exec(contentWindow)) !== null) {\n // Check if code is in image attributes\n const imagePart = imageMatch[0];\n const {braceMatch, quoteMatch} = checkImageAttributes(\n imagePart,\n imageMatch.index,\n codeText,\n );\n if (braceMatch || quoteMatch) {\n return true;\n }\n }\n\n // Additional check for YFM tables: if code is in one table cell,\n // and image in another cell of the same row, then code should not be marked as code block\n // Check if code is in YFM table context\n let lineIndex = 0;\n let charCount = 0;\n\n // Find the line where the code is located\n for (let i = 0; i < lines.length; i++) {\n if (charCount <= start && start < charCount + lines[i].length + 1) {\n lineIndex = i;\n break;\n }\n charCount += lines[i].length + 1;\n }\n\n // Check if line is in YFM table context\n if (lineIndex > 0 && lineIndex < lines.length - 1) {\n const prevLine = lines[lineIndex - 1];\n const currentLine = lines[lineIndex];\n const nextLine = lines[lineIndex + 1];\n\n // In YFM table, if code is in one cell and image in another,\n // then code should not be marked as code block\n // We need to check if code is in the same line as image\n if (\n prevLine.trim().startsWith('#|') &&\n nextLine.trim().startsWith('|#') &&\n currentLine.includes('\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n// Process inline tokens that may contain inline code\nfunction processInlineToken(\n token: Token,\n lineStarts: number[],\n content: string,\n parentStartPos: number,\n): number {\n if (!token.children || token.children.length === 0) {\n return parentStartPos;\n }\n\n let inlineStartPos = parentStartPos;\n if (token.map && token.map.length === 2) {\n const [startLine] = token.map;\n inlineStartPos = lineToCharPosition(startLine, lineStarts, content);\n }\n\n return inlineStartPos;\n}\n\nexport function resolveBlockCodes(this: LoaderContext, content: string) {\n if (!this.options.mergeContentParts || !content.includes('![')) {\n this.api.blockCodes.set([]);\n return content;\n }\n const md = new MarkdownIt({html: true});\n const diplodocOptions = {\n notesAutotitle: false,\n path: '',\n };\n\n md.use(deflist, diplodocOptions);\n md.use(imsize, diplodocOptions);\n md.use(yfmTable, diplodocOptions);\n\n const tokens = md.parse(content, {});\n\n const codes: Array<[number, number]> = [];\n\n const lines = content.split('\\n');\n const lineStarts = computeLineStarts(lines);\n\n function extractCodeBlocks(\n tokens: Token[],\n parentStartPos = 0,\n parentType: string | null = null,\n ) {\n for (const token of tokens) {\n let currentParentStartPos = parentStartPos;\n\n if (token.type === 'fence' || token.type === 'code_block') {\n processBlockCode(token, lineStarts, lines, content, codes);\n } else if (token.type === 'inline') {\n currentParentStartPos = processInlineToken(\n token,\n lineStarts,\n content,\n currentParentStartPos,\n );\n } else if (token.type === 'code_inline') {\n // Skip code_inline tokens that are children of image tokens\n if (parentType !== 'image') {\n currentParentStartPos = processInlineCode(\n token,\n content,\n currentParentStartPos,\n codes,\n lineStarts,\n lines,\n );\n }\n }\n\n if (token.children && token.children.length > 0) {\n extractCodeBlocks(token.children, currentParentStartPos, token.type);\n }\n }\n }\n\n extractCodeBlocks(tokens);\n\n this.api.blockCodes.set(codes);\n\n return content;\n}\n", "import type {PageContent} from '@diplodoc/page-constructor-extension';\nimport type {LoaderContext} from '../loader';\nimport type {Logger} from '~/core/logger';\n\nimport {dump as yamlDump, load as yamlLoad} from 'js-yaml';\n\nimport {filterBlocksByConditions, hasWhenConditions} from '~/core/utils';\n\nimport {PC_REGEX} from '../utils';\n\ntype Replacement = {\n start: number;\n end: number;\n replacement: string;\n};\n\ntype ProcessOptions = {\n vars: Record<string, unknown>;\n skipMissingVars: boolean;\n logger: Logger;\n path: NormalizedPath;\n};\n\nfunction processPageConstructorBlocks(content: string, options: ProcessOptions): string {\n const {vars, skipMissingVars, logger, path} = options;\n const blocks: Replacement[] = [];\n const openRegex = new RegExp(PC_REGEX.source, PC_REGEX.flags);\n\n let searchStart = 0;\n\n while (searchStart < content.length) {\n const remaining = content.slice(searchStart);\n const match = openRegex.exec(remaining);\n\n if (!match) {\n break;\n }\n\n const indent = match[1] || '';\n const matchIndex = searchStart + match.index;\n const contentStart = matchIndex + match[0].length;\n const closePattern = new RegExp(`^${indent}:::[ \\\\t]*$`, 'm');\n const afterMatch = content.slice(contentStart);\n const closeMatch = closePattern.exec(afterMatch);\n\n if (!closeMatch) {\n searchStart = contentStart;\n continue;\n }\n\n const yamlContent = afterMatch.slice(0, closeMatch.index);\n\n let data: PageContent;\n\n try {\n data = yamlLoad(yamlContent) as PageContent;\n } catch (error) {\n logger.warn(`Failed to parse page-constructor YAML in ${path}: ${error}`);\n searchStart = contentStart;\n continue;\n }\n\n if (!hasWhenConditions(data)) {\n searchStart = contentStart + closeMatch.index + closeMatch[0].length;\n continue;\n }\n\n const filtered = filterBlocksByConditions(data, vars, skipMissingVars);\n const hasBlocks = Array.isArray(filtered.blocks) && filtered.blocks.length > 0;\n\n const blockStart = matchIndex;\n const blockEnd = contentStart + closeMatch.index + closeMatch[0].length;\n\n if (hasBlocks) {\n const yaml = yamlDump(filtered, {\n lineWidth: -1,\n noRefs: true,\n quotingType: \"'\",\n forceQuotes: false,\n });\n\n const indentedYaml = yaml\n .split('\\n')\n .filter((line) => line.trim())\n .map((line) => `${indent}${line}`)\n .join('\\n');\n\n blocks.push({\n start: blockStart,\n end: blockEnd,\n replacement: `${indent}::: page-constructor\\n${indentedYaml}\\n${indent}:::\\n`,\n });\n } else {\n blocks.push({\n start: blockStart,\n end: blockEnd,\n replacement: '',\n });\n }\n\n searchStart = blockEnd;\n }\n\n for (let i = blocks.length - 1; i >= 0; i--) {\n const {start, end, replacement} = blocks[i];\n content = content.slice(0, start) + replacement + content.slice(end);\n }\n\n return content;\n}\n\nexport function resolveConditions(this: LoaderContext, content: string): string {\n const {skipMissingVars = false} = this.options;\n const vars = this.vars || {};\n\n content = processPageConstructorBlocks(content, {\n vars,\n skipMissingVars,\n logger: this.logger,\n path: this.path,\n });\n\n return content;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_node_path", "import_liquid", "import_utils", "import_utils", "import_liquid", "import_utils", "import_utils", "yamlLoad", "import_node_path", "import_utils", "fullPath", "matchStart", "imagePart", "MarkdownIt", "deflist", "imsize", "yfmTable", "tokens", "import_js_yaml", "import_utils", "yamlLoad", "yamlDump", "headings", "path"]
|
|
7
7
|
}
|
package/lib/markdown/index.mjs
CHANGED
|
@@ -78,7 +78,21 @@ import { bucket } from "@diplodoc/cli/lib/utils";
|
|
|
78
78
|
// src/core/markdown/loader/mangle-frontmatter.ts
|
|
79
79
|
import { extractFrontMatter, liquidJson } from "@diplodoc/liquid";
|
|
80
80
|
function safeExtractFrontmatter(content) {
|
|
81
|
-
|
|
81
|
+
try {
|
|
82
|
+
return extractFrontMatter(content);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
const err = error;
|
|
85
|
+
if (err.reason === "duplicated mapping key") {
|
|
86
|
+
const line = typeof err.mark?.line === "number" ? err.mark.line + 1 : void 0;
|
|
87
|
+
const key = line === void 0 ? "" : content.split("\n")[line]?.trim().split(":")[0];
|
|
88
|
+
if (key && key !== "vcsPath") {
|
|
89
|
+
const context = `[Reason: "${err.reason}"; Line: ${line}; Key: "${key}"]`;
|
|
90
|
+
const errorMessage = `${this.path}: ${line}: YFM017 / invalid front matter format ${context}`;
|
|
91
|
+
this.logger.error(errorMessage);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return extractFrontMatter(content, { json: true });
|
|
95
|
+
}
|
|
82
96
|
}
|
|
83
97
|
function mangleFrontMatter(rawContent) {
|
|
84
98
|
const { vars, options } = this;
|
|
@@ -1158,7 +1172,11 @@ var MarkdownService = class {
|
|
|
1158
1172
|
const file = normalizePath3(path);
|
|
1159
1173
|
const key = hash(file, from);
|
|
1160
1174
|
if (key in this.cache) {
|
|
1161
|
-
|
|
1175
|
+
const { content, varsMetadata, varsSystem, meta } = await this.cache[key];
|
|
1176
|
+
this.run.meta.addMetadata(file, varsMetadata);
|
|
1177
|
+
this.run.meta.addSystemVars(file, varsSystem);
|
|
1178
|
+
this.run.meta.add(file, meta, true);
|
|
1179
|
+
return content;
|
|
1162
1180
|
}
|
|
1163
1181
|
const defer = new Defer();
|
|
1164
1182
|
this.cache[key] = defer.promise;
|
|
@@ -1173,13 +1191,19 @@ var MarkdownService = class {
|
|
|
1173
1191
|
this.run.meta.addMetadata(file, vars.__metadata);
|
|
1174
1192
|
this.run.meta.addSystemVars(file, vars.__system);
|
|
1175
1193
|
this.run.meta.add(file, meta, true);
|
|
1176
|
-
|
|
1177
|
-
|
|
1194
|
+
const result = {
|
|
1195
|
+
content,
|
|
1196
|
+
varsMetadata: vars.__metadata,
|
|
1197
|
+
varsSystem: vars.__system,
|
|
1198
|
+
meta
|
|
1199
|
+
};
|
|
1200
|
+
this.cache[key] = result;
|
|
1201
|
+
defer.resolve(result);
|
|
1178
1202
|
await getHooks(this).Resolved.promise(content, file);
|
|
1179
1203
|
} catch (error) {
|
|
1180
1204
|
defer.reject(error);
|
|
1181
1205
|
}
|
|
1182
|
-
return defer.promise;
|
|
1206
|
+
return (await defer.promise).content;
|
|
1183
1207
|
}
|
|
1184
1208
|
async dump(file, markdown) {
|
|
1185
1209
|
const vfile = new VFile(file, markdown || await this.load(file));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/core/markdown/hooks.ts", "../../src/core/markdown/MarkdownService.ts", "../../src/core/markdown/loader.ts", "../../src/core/markdown/loader/mangle-frontmatter.ts", "../../src/core/markdown/loader/template-content.ts", "../../src/core/markdown/loader/resolve-comments.ts", "../../src/core/markdown/loader/resolve-deps.ts", "../../src/core/markdown/utils.ts", "../../src/core/markdown/loader/resolve-assets.ts", "../../src/core/markdown/loader/resolve-headings.ts", "../../src/core/markdown/loader/resolve-no-translate.ts", "../../src/core/markdown/loader/resolve-code.ts", "../../src/core/markdown/loader/resolve-conditions.ts"],
|
|
4
|
-
"sourcesContent": ["import type {VFile} from '~/core/utils';\nimport type {Collect, Plugin} from './types';\nimport type {Meta} from '~/core/meta';\n\nimport {AsyncSeriesHook, AsyncSeriesWaterfallHook} from 'tapable';\n\nimport {generateHooksAccess} from '~/core/utils';\n\nexport function hooks(name: string) {\n return {\n Collects: new AsyncSeriesWaterfallHook<[Collect[]]>(['collects'], `${name}.Collects`),\n Plugins: new AsyncSeriesWaterfallHook<[Plugin[]]>(['plugins'], `${name}.Plugins`),\n Loaded: new AsyncSeriesHook<[string, DeepFrozen<Meta>, NormalizedPath]>(\n ['markdown', 'meta', 'path'],\n `${name}.Loaded`,\n ),\n Resolved: new AsyncSeriesHook<[string, NormalizedPath]>(\n ['markdown', 'path'],\n `${name}.Resolved`,\n ),\n Dump: new AsyncSeriesHook<VFile<string>>(['vfile'], `${name}.Dump`),\n };\n}\n\nconst [getHooks, withHooks] = generateHooksAccess('Markdown', hooks);\n\nexport {getHooks, withHooks};\n", "import type {Run as BaseRun} from '~/core/run';\nimport type {VarsService} from '~/core/vars';\nimport type {Meta, MetaService} from '~/core/meta';\nimport type {LoaderContext, TransformMode} from './loader';\nimport type {\n AssetInfo,\n Collect,\n EntryGraph,\n EntryInfo,\n GraphInfo,\n HeadingInfo,\n IncludeInfo,\n Location,\n Plugin,\n} from './types';\n\nimport {dirname, join} from 'node:path';\nimport {SourceMap} from '@diplodoc/liquid';\n\nimport {Buckets, Defer, Graph, VFile, all, bounded, fullPath, normalizePath} from '~/core/utils';\n\nimport {getHooks, withHooks} from './hooks';\nimport {LoaderAPI, loader} from './loader';\nimport {parseHeading} from './utils';\n\ntype MarkdownServiceConfig = {\n outputFormat: `${TransformMode}`;\n template: {\n enabled: boolean;\n keepNotVar: boolean;\n legacyConditions: boolean;\n features: {\n substitutions: boolean;\n conditions?: boolean | 'strict';\n };\n scopes: {\n code: boolean;\n };\n };\n preprocess?: {\n mergeSvg?: boolean;\n mergeIncludes?: boolean;\n hashIncludes?: boolean;\n mergeAutotitles?: boolean;\n };\n};\n\ntype Run = BaseRun<MarkdownServiceConfig> & {\n meta: MetaService;\n vars: VarsService;\n};\n\ntype Options = {\n mode: 'build' | 'translate';\n skipMissingVars: boolean;\n};\n\nfunction hash(path: NormalizedPath, from?: NormalizedPath) {\n return `${path}${from ? '+' + from : ''}`;\n}\n\nconst byLocation = (a: HeadingInfo, b: HeadingInfo) => a.location[0] - b.location[0];\n\n@withHooks\nexport class MarkdownService {\n readonly name = 'Markdown';\n\n get logger() {\n return this.run.logger;\n }\n\n get plugins() {\n return this._plugins.slice();\n }\n\n get collects() {\n return this._collects.slice();\n }\n\n get config() {\n return this.run.config;\n }\n\n private run: Run;\n\n private _collects: Collect[] = [];\n\n private _plugins: Plugin[] = [];\n\n private pathToMeta = new Buckets<Meta>();\n\n private pathToComments = new Buckets<Location[]>();\n\n private pathToDeps = new Buckets<IncludeInfo[]>();\n\n private pathToAssets = new Buckets<AssetInfo[]>();\n\n private pathToHeadings = new Buckets<HeadingInfo[]>();\n\n private pathToSourcemap = new Buckets<Record<number | string, string>>();\n\n private cache: Hash<Promise<string> | string> = {};\n\n private options;\n\n constructor(run: Run, options: Options = {mode: 'build', skipMissingVars: false}) {\n this.run = run;\n this.options = options;\n }\n\n @bounded async init() {\n this._collects = await getHooks(this).Collects.promise(this._collects);\n this._plugins = await getHooks(this).Plugins.promise(this._plugins);\n }\n\n @bounded async load(path: RelativePath, from?: NormalizedPath) {\n const file = normalizePath(path);\n const key = hash(file, from);\n\n if (key in this.cache) {\n return this.cache[key];\n }\n\n const defer = new Defer();\n\n this.cache[key] = defer.promise;\n\n try {\n const source = normalizePath(join(this.run.input, file)) as AbsolutePath;\n const raw = await this.run.read(source);\n const vars = this.run.vars.for(file, from);\n\n const context = this.loaderContext(file, raw, vars, this.proxy(key));\n const content = await loader.call(context, raw);\n\n // At this point all internal states are fully resolved.\n // So we don't expect Defer here.\n const meta = context.api.meta.get() as Meta;\n\n await getHooks(this).Loaded.promise(raw, meta, file);\n\n this.run.meta.addMetadata(file, vars.__metadata);\n this.run.meta.addSystemVars(file, vars.__system);\n this.run.meta.add(file, meta, true);\n\n this.cache[key] = content;\n defer.resolve(content);\n\n // TODO: this may trigger uncaught exceptions\n // But if we move this two lines above, then program exits unexpectedly\n await getHooks(this).Resolved.promise(content, file);\n } catch (error) {\n defer.reject(error);\n }\n\n return defer.promise;\n }\n\n @bounded async dump(file: NormalizedPath, markdown?: string) {\n const vfile = new VFile<string, EntryInfo>(file, markdown || (await this.load(file)));\n\n vfile.info = {title: '', headings: []};\n\n await getHooks(this).Dump.promise(vfile);\n\n return vfile;\n }\n\n async meta(path: RelativePath) {\n return this._meta(normalizePath(path));\n }\n\n async deps(path: RelativePath) {\n return this._deps(normalizePath(path));\n }\n\n async graph(path: RelativePath) {\n return this._graph(normalizePath(path));\n }\n\n async relations(path: RelativePath) {\n return this._relations(normalizePath(path));\n }\n\n async assets(path: RelativePath) {\n return this._assets(normalizePath(path));\n }\n\n async headings(path: RelativePath) {\n return this._headings(normalizePath(path));\n }\n\n async titles(path: RelativePath) {\n const file = normalizePath(path);\n\n const titles: Hash<string> = {};\n\n try {\n const headings = await this.headings(file);\n const contents = headings.map(({content}) => content);\n\n for (const content of contents) {\n const {level, title, anchors} = parseHeading(content);\n\n if (level === 1 && !titles['#']) {\n titles['#'] = title;\n }\n\n for (const anchor of anchors) {\n titles[anchor] = title;\n }\n }\n } catch {\n // This is acceptable.\n // If this is a real file and someone depends on his titles,\n // then we throw exception in md plugin.\n }\n\n return titles;\n }\n\n @bounded async inspect(path: RelativePath, raw: string, vars: Hash) {\n const file = normalizePath(path);\n const api = new LoaderAPI();\n const context = this.loaderContext(file, raw, vars, api);\n const content = await loader.call(context, raw);\n\n const deps = api.deps.get();\n const assets = [...api.assets.get()];\n\n return {content, deps, assets};\n }\n\n remap(path: RelativePath, line: number): number {\n const file = normalizePath(path);\n const sourcemap = this.pathToSourcemap.get(file);\n\n if (!sourcemap) {\n return line;\n }\n\n return Number(sourcemap[line]) || line;\n }\n\n release(path: NormalizedPath, from?: NormalizedPath) {\n const key = hash(path, from);\n\n delete this.cache[key];\n this.pathToDeps.delete(key);\n this.pathToMeta.delete(key);\n this.pathToAssets.delete(key);\n this.pathToHeadings.delete(key);\n this.pathToComments.delete(key);\n this.pathToSourcemap.delete(key);\n }\n\n private async _meta(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n return this.pathToMeta.get(key);\n }\n\n private async _deps(file: NormalizedPath, from?: NormalizedPath): Promise<IncludeInfo[]> {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const deps = this.pathToDeps.get(key) || [];\n const internals: IncludeInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path}) => {\n return this._deps(path, from || file);\n }),\n );\n\n return deps.concat(...internals);\n }\n\n private async _graph(path: NormalizedPath, from?: NormalizedPath): Promise<EntryGraph> {\n const key = hash(path, from);\n\n const content = await this.load(path, from);\n const assets = this.pathToAssets.get(key) || [];\n const deps = await all(\n (this.pathToDeps.get(key) || []).map(async (dep) => {\n return {\n ...dep,\n ...(await this._graph(dep.path, from || path)),\n };\n }),\n );\n\n return {path, content, deps, assets};\n }\n\n private async _relations(\n path: NormalizedPath,\n from?: NormalizedPath,\n ): Promise<Graph<GraphInfo>> {\n const key = hash(path, from);\n const graph = new Graph<GraphInfo>();\n\n graph.addNode(path, {type: 'entry'});\n\n await this.load(path, from);\n await all(\n (this.pathToDeps.get(key) || []).map(async (dep) => {\n graph.consume(await this._relations(dep.path, from || path));\n graph.setNodeData(dep.path, {type: 'source'});\n graph.addDependency(path, dep.path);\n }),\n );\n\n (this.pathToAssets.get(key) || []).map(async (asset) => {\n if (['image', 'video'].includes(asset.type)) {\n graph.addNode(asset.path);\n graph.setNodeData(asset.path, {type: 'resource'});\n graph.addDependency(path, asset.path);\n }\n\n if (['link'].includes(asset.type) && asset.autotitle) {\n graph.addNode(asset.path);\n graph.setNodeData(asset.path, {type: 'source'});\n graph.addDependency(path, asset.path);\n }\n });\n\n const meta = this.run.meta.get(path);\n const resources = ([] as string[]).concat(meta.script || [], meta.style || []);\n for (const resource of resources) {\n const file = normalizePath(join(dirname(path), resource));\n graph.addNode(file);\n graph.setNodeData(file, {type: 'resource'});\n graph.addDependency(path, file);\n }\n\n return graph;\n }\n\n private async _assets(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const assets = this.pathToAssets.get(key) || [];\n const internals: AssetInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path}) => {\n return this._assets(path, from || file);\n }),\n );\n\n return assets.concat(...internals);\n }\n\n private async _headings(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const headings = this.pathToHeadings.get(key) || [];\n const internals: HeadingInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path, location}) => {\n const headings = await this._headings(path, from || file);\n return headings.map((heading) => ({...heading, location}));\n }),\n );\n\n return headings.concat(...internals).sort(byLocation);\n }\n\n private proxy(key: string) {\n return {\n deps: this.pathToDeps.bind(key),\n assets: this.pathToAssets.bind(key),\n meta: this.pathToMeta.bind(key),\n comments: this.pathToComments.bind(key),\n headings: this.pathToHeadings.bind(key),\n sourcemap: this.pathToSourcemap.bind(key),\n };\n }\n\n private loaderContext(\n path: NormalizedPath,\n raw: string,\n vars: Hash,\n api?: Partial<LoaderAPI>,\n ): LoaderContext {\n return {\n path,\n vars,\n logger: this.logger,\n readFile: (path: RelativePath) => {\n return this.run.read(join(this.run.input, path));\n },\n emitFile: async (file: NormalizedPath, content: string) => {\n const rootPath = fullPath(file, path);\n await this.run.write(join(this.run.input, rootPath), content, true);\n },\n fullPath: (path: RelativePath) => join(this.run.input, path),\n input: this.run.input,\n api: new LoaderAPI(api),\n collects: this.collects,\n sourcemap: new SourceMap(raw),\n settings: {\n substitutions: this.config.template.features.substitutions,\n conditions:\n typeof this.config.template.features.conditions === 'string'\n ? (this.config.template.features.conditions as 'strict')\n : Boolean(this.config.template.features.conditions),\n conditionsInCode: this.config.template.scopes.code,\n keepNotVar: this.config.template.keepNotVar,\n legacyConditions: this.config.template.legacyConditions,\n keepConditionSyntaxOnTrue: this.options.mode === 'translate',\n },\n options: {\n disableLiquid: !this.config.template.enabled,\n mergeContentParts: this.config.preprocess?.mergeSvg ?? false,\n skipMissingVars: this.options.skipMissingVars,\n },\n mode: this.options.mode,\n };\n }\n}\n", "import type {LiquidContext, SourceMap} from '@diplodoc/liquid';\nimport type {Meta} from '~/core/meta';\nimport type {Logger} from '~/core/logger';\nimport type {Bucket} from '~/core/utils';\nimport type {AssetInfo, Collect, HeadingInfo, IncludeInfo, Location} from './types';\n\nimport {merge} from 'lodash';\n\nimport {bucket} from '~/core/utils';\n\nimport {mangleFrontMatter} from './loader/mangle-frontmatter';\nimport {templateContent} from './loader/template-content';\nimport {resolveComments} from './loader/resolve-comments';\nimport {resolveDependencies} from './loader/resolve-deps';\nimport {resolveAssets} from './loader/resolve-assets';\nimport {resolveHeadings} from './loader/resolve-headings';\nimport {resolveNoTranslate} from './loader/resolve-no-translate';\nimport {resolveBlockCodes} from './loader/resolve-code';\nimport {resolveConditions} from './loader/resolve-conditions';\n\nexport enum TransformMode {\n Html = 'html',\n Md = 'md',\n}\n\nexport class LoaderAPI {\n blockCodes: Bucket<Location[]>;\n comments: Bucket<Location[]>;\n deps: Bucket<IncludeInfo[]>;\n assets: Bucket<AssetInfo[]>;\n meta: Bucket<Meta>;\n headings: Bucket<HeadingInfo[]>;\n sourcemap: Bucket<Record<number | string, string>>;\n\n constructor(proxy: Partial<LoaderAPI> = {}) {\n this.blockCodes = proxy.blockCodes || bucket();\n this.deps = proxy.deps || bucket();\n this.assets = proxy.assets || bucket();\n this.meta = proxy.meta || bucket();\n this.comments = proxy.comments || bucket();\n this.headings = proxy.headings || bucket();\n this.sourcemap = proxy.sourcemap || bucket();\n }\n}\n\nexport type LoaderContext = LiquidContext & {\n path: NormalizedPath;\n vars: Hash;\n logger: Logger;\n emitFile(path: NormalizedPath, content: string): Promise<void>;\n readFile(path: NormalizedPath): Promise<string>;\n fullPath(path: RelativePath): AbsolutePath;\n input: AbsolutePath;\n collects: Collect[];\n api: LoaderAPI;\n sourcemap: SourceMap;\n options: {\n disableLiquid: boolean;\n mergeContentParts: boolean;\n skipMissingVars?: boolean;\n };\n mode: 'build' | 'translate';\n};\n\nexport async function loader(this: LoaderContext, content: string) {\n content = mangleFrontMatter.call(this, content);\n content = resolveNoTranslate.call(this, content);\n content = templateContent.call(this, content);\n content = resolveConditions.call(this, content);\n content = await applyCollectPlugins.call(this, content);\n content = resolveBlockCodes.call(this, content);\n content = resolveComments.call(this, content);\n content = resolveDependencies.call(this, content);\n content = resolveAssets.call(this, content);\n content = resolveHeadings.call(this, content);\n\n this.api.sourcemap.set(this.sourcemap.dump());\n\n return content;\n}\n\nasync function applyCollectPlugins(this: LoaderContext, content: string) {\n let meta = {};\n\n for (const collect of this.collects) {\n let result = await collect.call(this, content, {});\n\n if (Array.isArray(result)) {\n meta = merge(meta, result[1] || {});\n result = result[0] as string;\n }\n\n if (result !== undefined) {\n content = result as string;\n }\n }\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nimport {extractFrontMatter, liquidJson} from '@diplodoc/liquid';\n\nfunction safeExtractFrontmatter(this: LoaderContext, content: string) {\n return extractFrontMatter(content, {json: true});\n}\n\nexport function mangleFrontMatter(this: LoaderContext, rawContent: string) {\n const {vars, options} = this;\n const {disableLiquid} = options;\n\n const [frontmatter, content, rawFrontmatter] = safeExtractFrontmatter.call(this, rawContent);\n\n if (!rawFrontmatter) {\n this.api.meta.set({});\n return rawContent;\n }\n\n if (disableLiquid) {\n this.api.meta.set(frontmatter);\n } else {\n this.api.meta.set(liquidJson.call(this, frontmatter, vars));\n }\n\n this.sourcemap.delete(1, rawFrontmatter);\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nimport {liquidDocument, liquidSnippet} from '@diplodoc/liquid';\n\nexport function templateContent(this: LoaderContext, rawContent: string) {\n const {vars, options} = this;\n const {disableLiquid} = options;\n\n if (disableLiquid) {\n return rawContent;\n }\n\n let content;\n\n if (this.mode === 'translate') {\n content = liquidDocument.call(this, rawContent, vars);\n } else {\n content = liquidSnippet.call(this, rawContent, vars, this.sourcemap);\n }\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nexport function resolveComments(this: LoaderContext, content: string) {\n const COMMENTS_CONTENTS = /<!-{2,}[\\s\\S]*?-{2,}>/g;\n const comments = [];\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = COMMENTS_CONTENTS.exec(content))) {\n comments.push([match.index, COMMENTS_CONTENTS.lastIndex] as [number, number]);\n }\n\n this.api.comments.set(comments);\n\n return content;\n}\n", "import type {IncludeInfo} from '../types';\nimport type {LoaderContext} from '../loader';\n\nimport {dirname, join} from 'node:path';\n\nimport {normalizePath, parseLocalUrl, rebasePath} from '~/core/utils';\n\nimport {filterRanges, findLink} from '../utils';\n\nexport function resolveDependencies(this: LoaderContext, content: string) {\n const includes = [];\n const exclude = [...this.api.comments.get()];\n\n // Include example: {% include [createfolder](create-folder.md) %}\n // Regexp result: [createfolder](create-folder.md)\n const INCLUDE_CONTENTS = /{%\\s*include\\s*.+?%}/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = INCLUDE_CONTENTS.exec(content))) {\n // Ugly workaround for include examples\n // TODO: rewrite all inspect code on markdown-it parsing with minimal set of plugins\n if (content[match.index - 1] === '`') {\n continue;\n }\n\n const link = findLink(match[0]) as string;\n // TODO: warn about non local urls\n const include = parseLocalUrl<IncludeInfo>(link);\n\n if (include && include.path) {\n const currentPath = this.path;\n const normalizedIncludePath = normalizePath(join(dirname(currentPath), include.path));\n\n if (normalizedIncludePath === currentPath) {\n this.logger.error('YFM016', `${currentPath}: The file is included in itself`);\n\n continue;\n }\n\n include.path = rebasePath(currentPath, include.path as RelativePath);\n include.link = link;\n include.match = content.slice(match.index, INCLUDE_CONTENTS.lastIndex);\n include.location = [match.index, INCLUDE_CONTENTS.lastIndex];\n\n includes.push(include);\n }\n }\n\n this.api.deps.set(filterRanges(exclude, includes));\n\n return content;\n}\n", "import type {AssetInfo, ImageOptions, Location} from './types';\nimport type {ConstructorBlock, PageContent} from '@diplodoc/page-constructor-extension';\n\nimport {load as yamlLoad} from 'js-yaml';\n\nimport {MEDIA_FORMATS, parseLocalUrl, walkLinks} from '~/core/utils';\n\ntype AssetModifier = '!' | '@' | '';\n\nconst modifiers = {'!': 'image', '@': 'video', '': 'link'} as const;\n\nexport function findLink(content: string): string | undefined {\n const rx = /]\\(\\s*/g;\n const match = rx.exec(content);\n if (!match) {\n return undefined;\n }\n\n const link = parseLinkDestination(content, rx.lastIndex);\n\n if (link === null || link.match(/[${}]/)) {\n return undefined;\n }\n\n rx.lastIndex += link.length + 1;\n\n return link;\n}\n\nexport function extractImages(block: ConstructorBlock | string): string[] {\n const images: string[] = [];\n\n if (!block) {\n return images;\n }\n\n if (typeof block === 'string') {\n const trimmedBlock = block.trim();\n\n if (MEDIA_FORMATS.test(trimmedBlock) && trimmedBlock.split(/\\s+/).length === 1) {\n images.push(trimmedBlock);\n }\n\n return images;\n }\n\n walkLinks(block, (value) => {\n if (MEDIA_FORMATS.test(value) && value.split(/\\s+/).length === 1) {\n images.push(value);\n }\n });\n\n return images;\n}\n\nexport function parsePcBlocks(blocks: ConstructorBlock[] = [], images: string[] = []): string[] {\n for (const block of blocks) {\n images.push(...extractImages(block));\n }\n\n return images;\n}\n\nexport function getPcIconTitle(iconPath: string): string {\n const file = iconPath.split('/').pop() || iconPath;\n\n return file.replace(/\\.[^.]+$/, '');\n}\n\nexport const PC_REGEX = /^([ \\t]*):::\\s*page-constructor[ \\t]*\\r?\\n?/m;\n\nexport function findPcImages(content: string): AssetInfo[] {\n const pcImages: AssetInfo[] = [];\n const openRegex = new RegExp(PC_REGEX.source, PC_REGEX.flags);\n\n let searchStart = 0;\n\n while (searchStart < content.length) {\n const remaining = content.slice(searchStart);\n const match = openRegex.exec(remaining);\n\n if (!match) {\n break;\n }\n\n const indent = match[1] || '';\n const matchIndex = searchStart + match.index;\n const startIdx = matchIndex + match[0].length;\n const closeRegex = new RegExp(`^${indent}:::[ \\\\t]*$`, 'm');\n const afterMatch = content.slice(startIdx);\n const closeMatch = closeRegex.exec(afterMatch);\n\n if (!closeMatch) {\n searchStart = startIdx;\n continue;\n }\n\n const rawBlock = afterMatch.slice(0, closeMatch.index);\n let data: PageContent;\n\n try {\n data = yamlLoad(rawBlock) as PageContent;\n } catch {\n searchStart = startIdx;\n continue;\n }\n\n const images = parsePcBlocks(data?.blocks as ConstructorBlock[], []);\n\n for (const img of images) {\n const parsed = parseLocalUrl(img);\n\n if (!parsed) {\n continue;\n }\n\n const blockEnd = startIdx + closeMatch.index + closeMatch[0].length;\n\n pcImages.push({\n ...parsed,\n type: 'image',\n subtype: 'image',\n title: getPcIconTitle(img),\n autotitle: false,\n hash: null,\n search: null,\n location: [matchIndex, blockEnd],\n // no inline svg inside page-constructor because we hasn't a location for asset\n options: {width: undefined, height: undefined, inline: false},\n });\n }\n\n searchStart = startIdx + closeMatch.index + closeMatch[0].length;\n }\n\n return pcImages;\n}\n\nexport function findLinksInfo(content: string): AssetInfo[] {\n const links = find(/]\\(\\s*/g, content, (match, rx) => {\n const link = parseLinkDestination(content, rx.lastIndex);\n const title = parseLinkTitle(content, rx.lastIndex - match[0].length);\n const options = parseLinkOptions(content, rx.lastIndex + (link?.length || 0) + 1);\n\n // TODO: add more precise filter for unix compatible paths\n if (link === null || title === null || link.match(/[${}]/)) {\n return undefined;\n }\n\n const parsed = parseLocalUrl(link);\n if (!parsed) {\n return undefined;\n }\n\n const modifier = content[\n rx.lastIndex - match[0].length - title.length - 2\n ] as AssetModifier;\n const type = modifiers[modifier] || 'link';\n\n rx.lastIndex += link.length + 1;\n\n return {\n ...parsed,\n type,\n subtype: type === 'image' ? 'image' : null,\n title,\n autotitle: type === 'link' && (!title || title === '{#T}'),\n options,\n };\n });\n\n const referenceLinks = find(/]\\[\\s*/g, content, (match, rx) => {\n let link = parseLinkDestination(content, rx.lastIndex, ['[', ']']);\n let title = parseLinkTitle(content, rx.lastIndex - match[0].length);\n const options = parseLinkOptions(content, rx.lastIndex + (link?.length || 0) + 1);\n\n // TODO: add more precise filter for unix compatible paths\n if ((link === null && title === null) || link?.match(/[${}]/)) {\n return undefined;\n }\n title = title || '';\n link = link || title;\n\n const parsed = parseLocalUrl(link);\n if (!parsed) {\n return undefined;\n }\n\n const modifier = content[\n rx.lastIndex - match[0].length - title.length - 2\n ] as AssetModifier;\n const type = modifiers[modifier] || 'link';\n\n rx.lastIndex += (content[rx.lastIndex] === ']' ? 0 : link.length) + 1;\n\n return {\n ...parsed,\n type,\n subtype: 'reference',\n code: link,\n title,\n autotitle: type === 'link' && (!title || title === '{#T}'),\n options,\n };\n });\n\n return [...links, ...referenceLinks];\n}\n\nexport function findDefs(content: string): AssetInfo[] {\n return find(/^\\s*\\[(.*?)]:\\s*([^\\s]+)/gm, content, (match) => {\n const parsed = parseLocalUrl(match[2]);\n if (!parsed) {\n return undefined;\n }\n\n return {\n ...parsed,\n type: 'def',\n code: match[1] || undefined,\n title: '',\n autotitle: true,\n };\n });\n}\n\nfunction find(\n matcher: RegExp,\n content: string,\n map: (match: RegExpMatchArray, rx: RegExp) => Omit<AssetInfo, 'location'> | void,\n): AssetInfo[] {\n const links: AssetInfo[] = [];\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = matcher.exec(content))) {\n const result = map(match, matcher);\n if (!result) {\n continue;\n }\n\n if (result) {\n links.push({\n ...result,\n location: [match.index, matcher.lastIndex],\n });\n }\n }\n\n return links;\n}\n\nfunction parseLinkDestination(str: string, start: number, symbols = ['(', ')']) {\n const max = str.length;\n const [symbolStart, symbolEnd] = symbols.map((symbol) => symbol.charCodeAt(0));\n\n let code,\n level = 0,\n pos = start;\n\n if (str.charCodeAt(pos) === 0x3c /* < */) {\n return parseSimpleLink(str, start + 1);\n }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x20) {\n break;\n }\n\n // ascii control characters\n if (code < 0x20 || code === 0x7f) {\n break;\n }\n\n if (code === 0x5c /* \\ */ && pos + 1 < max) {\n if (str.charCodeAt(pos + 1) === 0x20) {\n break;\n }\n pos += 2;\n continue;\n }\n\n if (code === symbolStart /* ( or [ */) {\n level++;\n if (level > 32) {\n return null;\n }\n }\n\n if (code === symbolEnd /* ) or ] */) {\n if (level === 0) {\n break;\n }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos) {\n return null;\n }\n if (level !== 0) {\n return null;\n }\n\n return str.slice(start, pos);\n}\n\nfunction parseLinkTitle(str: string, start: number) {\n let code,\n prev,\n level = 0,\n pos = start;\n\n while (pos >= 0) {\n code = str.charCodeAt(pos);\n prev = str.charCodeAt(pos - 1);\n\n // ascii control characters\n if (code < 0x20 || code === 0x7f) {\n break;\n }\n\n if (prev === 0x5c /* \\ */) {\n pos -= 2;\n continue;\n }\n\n if (code === 93 /* ] */) {\n level++;\n if (level > 32) {\n return null;\n }\n }\n\n if (code === 91 /* [ */) {\n if (level === 1) {\n break;\n }\n level--;\n }\n\n pos--;\n }\n\n return str.slice(pos + 1, start);\n}\n\nfunction parseLinkOptions(str: string, start: number): ImageOptions {\n const max = str.length;\n const options: ImageOptions = {\n width: undefined,\n height: undefined,\n inline: undefined,\n };\n let code,\n level = 0,\n pos = start,\n startOption = start;\n\n if (str[pos - 1] !== ')') {\n level--;\n }\n if (str.charCodeAt(pos) !== 0x7b /* { */ && level === 0) {\n return options;\n }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x29 /* ) */ && level === -1) {\n if (str.charCodeAt(pos + 1) !== 0x7b) {\n return options;\n }\n level++;\n }\n\n if (code === 0x7b /* { */ && level > -1) {\n level++;\n startOption = pos + 1;\n if (level > 32) {\n return options;\n }\n }\n\n if (code === 0x7d /* } */) {\n if (level === 1) {\n level--;\n break;\n }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos || level !== 0) {\n return options;\n }\n\n const attrRegex = /(\\w+)=(?:'([^']*)'|\"([^\"]*)\"|(\\S+))/g;\n const optionsString = str.slice(startOption, pos);\n let match;\n\n while ((match = attrRegex.exec(optionsString)) !== null) {\n const key = match[1] as keyof ImageOptions;\n const value = match[2] || match[3] || match[4];\n\n if (key === 'inline') {\n options[key] = value === 'true';\n } else {\n options[key] = value;\n }\n }\n\n return options;\n}\n\nfunction parseSimpleLink(str: string, start: number) {\n const max = str.length;\n\n let code,\n pos = start;\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === 0x0a /* \\n */) {\n return null;\n }\n if (code === 0x3c /* < */) {\n return null;\n }\n if (code === 0x3e /* > */) {\n return str.slice(start, pos);\n }\n if (code === 0x5c /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n pos++;\n }\n\n // no closing '>'\n return null;\n}\n\nexport function filterRanges<T extends {location: Location}>(\n excludes: Location[],\n infos: T[],\n): T[] {\n const contains = (exclude: Location, point: Location) => {\n return (\n (exclude[1] >= point[0] && exclude[1] <= point[1]) ||\n (exclude[0] >= point[0] && exclude[0] < point[1]) ||\n (exclude[0] < point[0] && exclude[1] >= point[1])\n );\n };\n\n return infos.filter((item) => {\n return !excludes.some((exclude) => contains(exclude, item.location));\n });\n}\n\nexport function parseHeading(content: string) {\n const anchors = [];\n const commonHeading = content.match(/^#+/);\n const alternateHeading = content[content.length - 1];\n const alternaleLevels = ['-', '='];\n const level = commonHeading\n ? commonHeading[0].length\n : alternaleLevels.indexOf(alternateHeading) + 1;\n\n if (commonHeading) {\n content = content.replace(/^#+\\s*/, '');\n } else {\n content = content.replace(/\\n[-=]+$/, '');\n }\n\n const ANCHOR = /[^[]{(#[^}]+)}/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = ANCHOR.exec(content))) {\n anchors.push(match[1]);\n content = content.replace(match[0], '');\n ANCHOR.lastIndex -= match[0].length;\n }\n\n const title = content.trim();\n\n return {anchors, title, level};\n}\n", "import type {LoaderContext} from '../loader';\nimport type {AssetInfo} from '../types';\n\nimport {join} from 'node:path';\n\nimport {fs, normalizePath, rebasePath} from '~/core/utils';\n\nimport {filterRanges, findDefs, findLinksInfo, findPcImages} from '../utils';\n\nfunction fixUnreachableLink(path: RelativePath, loaderContext: LoaderContext) {\n let newPath = path;\n const pathnameParts = normalizePath(path).split('/');\n const relativePartsCount = pathnameParts.filter((part: string) => part === '..').length;\n let includedFilePath;\n\n for (let i = 0; i <= relativePartsCount; i++) {\n try {\n includedFilePath = normalizePath(\n join(loaderContext.input, pathnameParts.slice(i).join('/')),\n );\n fs.realpathSync(includedFilePath);\n if (i > 0) {\n newPath = normalizePath(pathnameParts.slice(i).join('/'));\n loaderContext.logger.error(`Path was fixed from ${path} \n to ${newPath}`);\n }\n return newPath;\n } catch {\n if (i === relativePartsCount - 1) {\n return newPath;\n } else {\n continue;\n }\n }\n }\n return newPath;\n}\n\nfunction getSize(\n path: RelativePath,\n loaderContext: LoaderContext,\n assetSizes: Map<RelativePath, number>,\n) {\n if (path === null) {\n return 0;\n }\n if (assetSizes.has(path)) {\n return assetSizes.get(path) as number;\n }\n\n try {\n const fixedPath = fixUnreachableLink(path, loaderContext);\n const fullPath = loaderContext.fullPath(fixedPath);\n const size = fs.statSync(fullPath).size;\n assetSizes.set(path, size);\n return size;\n } catch {\n assetSizes.set(path, 0);\n return 0;\n }\n}\n\nexport function resolveAssets(this: LoaderContext, content: string) {\n const assets: AssetInfo[] = [];\n const assetSizes = new Map<RelativePath, number>();\n\n const exclude = [\n ...this.api.deps.get().map(({location}) => location),\n ...this.api.comments.get(),\n ...this.api.blockCodes.get(),\n ];\n\n const defs = filterRanges(exclude, findDefs(content));\n const links = filterRanges(exclude, findLinksInfo(content));\n const pcImages = filterRanges(exclude, findPcImages(content));\n\n for (const info of [...defs, ...links, ...pcImages]) {\n try {\n if (info.path !== null && !info.path?.startsWith('*') && !info.path?.includes('%')) {\n info.path = rebasePath(this.path, decodeURIComponent(info.path) as RelativePath);\n }\n\n let size = 0;\n if (['def', 'image'].includes(info.type) && info.subtype === 'image') {\n size = getSize(info.path, this, assetSizes);\n }\n\n assets.push({...info, size});\n } catch (error) {\n this.logger.warn(`Error processing asset from ${this.path} to ${info.path}: ${error}`);\n }\n }\n\n this.api.assets.set([...assets]);\n\n return content;\n}\n", "import type {Location} from '../types';\nimport type {LoaderContext} from '../loader';\n\nimport {filterRanges} from '../utils';\n\nexport function resolveHeadings(this: LoaderContext, content: string) {\n const headings = [];\n const exclude = [...this.api.comments.get()];\n\n const heading = /(?<=^|\\n)([#=-])/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = heading.exec(content))) {\n const [result, location] =\n match[1] === '#'\n ? findCommonHeading(match.index, content)\n : findAlternateHeading(match.index, content);\n\n if (result) {\n headings.push({content: result, location});\n heading.lastIndex = location[1];\n }\n }\n\n this.api.headings.set(filterRanges(exclude, headings));\n\n return content;\n}\n\nconst SPACE = /[ \\t]/;\n\nfunction findCommonHeading(start: number, content: string): [string, Location] | never[] {\n let title = '';\n\n let index = start;\n while (index < content.length) {\n if (index - start > 6) {\n return [];\n }\n\n if (content[index] === '#') {\n index++;\n } else if (content[index].match(SPACE)) {\n break;\n } else {\n return [];\n }\n }\n\n while (index < content.length) {\n if (content[index + 1] && content[index] !== '\\n') {\n title += content[index];\n index++;\n } else if (title.trim()) {\n return [content.slice(start, index), [start, index]];\n } else {\n return [];\n }\n }\n\n return [];\n}\n\nfunction findAlternateHeading(start: number, content: string): [string, Location] | never[] {\n const delim = content[start];\n const newline = [];\n\n let title = '';\n\n let end = start;\n while (end < content.length) {\n if (content[end] === delim) {\n end++;\n } else if (content[end] === '\\n' || !content[end + 1]) {\n break;\n } else {\n return [];\n }\n }\n\n let index = start - 1;\n while (index >= 0) {\n const isContentStart = !index;\n const isTitleStart = newline.length === 2 && !content.slice(...newline).trim();\n\n if (newline.length && !isTitleStart) {\n newline.length = 1;\n }\n\n if (!isTitleStart) {\n title = content[index] + title;\n }\n\n if (isContentStart || isTitleStart) {\n const clean = title.trimStart();\n if (clean) {\n return [content.slice(start - clean.length, end), [start - clean.length, end]];\n } else {\n return [];\n }\n }\n\n if (content[index] === '\\n') {\n newline.unshift(index);\n }\n\n index--;\n }\n\n return [];\n}\n", "import type {LoaderContext} from '../loader';\n\nexport function resolveNoTranslate(this: LoaderContext, content: string) {\n if (this.mode === 'translate') {\n return content;\n }\n\n content = resolveContainerDirectives(content);\n\n content = resolveLeafBlockDirectives(content);\n\n content = resolveInlineDirectives(content);\n\n return content;\n}\n\nfunction resolveContainerDirectives(content: string): string {\n const lines = content.split('\\n');\n const result = [];\n\n const stack = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.trim().startsWith(':::')) {\n const directiveLine = line.trim();\n\n if (directiveLine === ':::') {\n if (stack.length > 0) {\n const lastDirective = stack.pop();\n\n if (lastDirective === 'no-translate' && stack.length === 0) {\n continue;\n }\n\n result.push(line);\n }\n } else {\n const directiveMatch = directiveLine.match(/^:::\\s*([^\\s]+)/);\n const directiveName = directiveMatch ? directiveMatch[1] : '';\n\n if (directiveName === 'no-translate') {\n stack.push('no-translate');\n continue;\n } else {\n stack.push(directiveName);\n result.push(line);\n }\n }\n } else {\n result.push(line);\n }\n }\n\n return result.join('\\n');\n}\n\nfunction resolveLeafBlockDirectives(content: string): string {\n const blockRegex = /::\\s*no-translate\\s*\\[([\\s\\S]*?)\\]/g;\n\n return content.replace(blockRegex, (_, innerContent) => {\n return innerContent;\n });\n}\n\nfunction resolveInlineDirectives(content: string): string {\n const inlineRegex = /(?<![:]):no-translate\\s*\\[([\\s\\S]*?)\\]/g;\n\n return content.replace(inlineRegex, (_, innerContent) => {\n return innerContent;\n });\n}\n", "import type {LoaderContext} from '../loader';\nimport type Token from 'markdown-it/lib/token';\n\nimport MarkdownIt from 'markdown-it';\n// @ts-ignore\nimport deflist from 'markdown-it-deflist';\nimport imsize from '@diplodoc/transform/lib/plugins/imsize';\nimport yfmTable from '@diplodoc/transform/lib/plugins/table';\n\nfunction computeLineStarts(lines: string[]): number[] {\n const lineStarts: number[] = [0];\n for (let i = 1; i < lines.length; i++) {\n const lineEndingLength = 1; //lines[i - 1].endsWith('\\r') ? 2 : 1;\n lineStarts[i] = lineStarts[i - 1] + lines[i - 1].length + lineEndingLength;\n }\n return lineStarts;\n}\n\nconst lineToCharPosition = (line: number, lineStarts: number[], content: string): number =>\n line >= lineStarts.length ? content.length : lineStarts[line];\n\nfunction calculateAdjustedEnd(\n endLine: number,\n lineStarts: number[],\n lines: string[],\n content: string,\n): number {\n let end = content.length;\n if (endLine <= lineStarts.length) {\n end = endLine === 0 ? 0 : lineStarts[endLine - 1] + lines[endLine - 1].length;\n }\n return endLine <= lines.length && endLine > 0 ? end + 1 : end;\n}\n\n// Process block code tokens (fence and code_block)\nfunction processBlockCode(\n token: Token,\n lineStarts: number[],\n lines: string[],\n content: string,\n codes: Array<[number, number]>,\n) {\n if (!token.map || token.map.length !== 2) {\n return;\n }\n\n const [startLine, endLine] = token.map;\n\n const start = lineToCharPosition(startLine, lineStarts, content);\n\n let adjustedEnd: number;\n if (token.type === 'fence' && endLine <= lines.length) {\n const endLineContent = lines[endLine - 1] || '';\n const fenceEndIndex = endLineContent.indexOf(token.markup);\n if (fenceEndIndex > -1) {\n const lineStart = lineStarts[endLine - 1] || 0;\n const fenceEndPos = lineStart + fenceEndIndex + token.markup.length;\n adjustedEnd = fenceEndPos;\n } else {\n adjustedEnd = calculateAdjustedEnd(endLine, lineStarts, lines, content);\n }\n } else {\n adjustedEnd = calculateAdjustedEnd(endLine, lineStarts, lines, content);\n }\n\n codes.push([start, adjustedEnd]);\n}\n\n// Check specific attribute in image part\nfunction checkAttribute(\n imagePart: string,\n matchStart: number,\n codeText: string | null,\n start: number | undefined,\n end: number | undefined,\n regex: RegExp,\n getAttrStart: (matchStart: number, imagePart: string) => number,\n): boolean {\n const match = imagePart.match(regex);\n if (match) {\n if (codeText !== null) {\n // Check if code text is in attributes\n if (match[1].includes(codeText)) {\n return true;\n }\n } else if (start !== undefined && end !== undefined) {\n // Check if code range falls within attributes\n const attrStart = getAttrStart(matchStart, imagePart);\n const attrEnd = attrStart + match[0].length;\n if (start >= attrStart && end <= attrEnd) {\n return true;\n }\n }\n }\n return false;\n}\n\n// Check attributes in image part\nfunction checkImageAttributes(\n imagePart: string,\n matchStart: number,\n codeText: string | null,\n start?: number,\n end?: number,\n): {braceMatch: boolean; quoteMatch: boolean} {\n // Check attributes in curly braces {...}\n const braceMatch = checkAttribute(\n imagePart,\n matchStart,\n codeText,\n start,\n end,\n /\\s*{([^}]*)}/,\n (matchStart, imagePart) => matchStart + imagePart.indexOf('{'),\n );\n\n // Check title attribute in quotes \"...\"\n const quoteMatch = checkAttribute(\n imagePart,\n matchStart,\n codeText,\n start,\n end,\n /\\s*\"([^\"]*)\"/,\n (matchStart, imagePart) => matchStart + imagePart.indexOf('\"'),\n );\n\n return {braceMatch, quoteMatch};\n}\n\n// Add code to array and update position\nfunction addCodeAndUpdatePosition(\n startIndex: number,\n endIndex: number,\n content: string,\n codes: Array<[number, number]>,\n parentStartPos: number,\n lines: string[],\n): number {\n // Check if this code is inside image attributes\n const insideAttrs = isInsideImageAttributes(content, startIndex, endIndex, lines);\n if (!insideAttrs) {\n codes.push([startIndex, endIndex]);\n }\n\n // Update parentStartPos to avoid finding the same match again\n return insideAttrs ? parentStartPos : Math.max(parentStartPos, endIndex);\n}\n\n// Process inline code tokens\nfunction processInlineCode(\n token: Token,\n content: string,\n parentStartPos: number,\n codes: Array<[number, number]>,\n lineStarts: number[],\n lines: string[],\n): number {\n if (!token.markup || !token.content) {\n return parentStartPos;\n }\n\n // Use token's position information if available\n if (token.map && token.map.length === 2) {\n const [startLine, _endLine] = token.map;\n const start = lineToCharPosition(startLine, lineStarts, content);\n\n // Find the exact position of the inline code within the line\n const lineContent = lines[startLine] || '';\n const searchPattern = token.markup + token.content + token.markup;\n const patternIndex = lineContent.indexOf(searchPattern);\n\n if (patternIndex !== -1) {\n const startIndex = start + patternIndex;\n const endIndex = startIndex + searchPattern.length;\n\n return addCodeAndUpdatePosition(\n startIndex,\n endIndex,\n content,\n codes,\n parentStartPos,\n lines,\n );\n }\n } else {\n const searchPattern = token.markup + token.content + token.markup;\n const startIndex = content.indexOf(searchPattern, parentStartPos);\n\n if (startIndex !== -1) {\n const endIndex = startIndex + searchPattern.length;\n\n return addCodeAndUpdatePosition(\n startIndex,\n endIndex,\n content,\n codes,\n parentStartPos,\n lines,\n );\n }\n }\n\n return parentStartPos;\n}\n\n// Function to check if code is inside image attributes\nfunction isInsideImageAttributes(\n content: string,\n start: number,\n end: number,\n lines: string[],\n): boolean {\n // Limit regex search to a smaller window around the code for better performance\n const windowSize = 200; // Reduced window size for better performance\n const checkStart = Math.max(0, start - windowSize);\n const checkEnd = Math.min(content.length, end + windowSize);\n const contentWindow = content.substring(checkStart, checkEnd);\n\n // Only search for images in the limited window\n const imageRegex = /!\\[[^\\]]*\\]\\([^)]*\\)(?:\\s*\"[^\"]*\")?(?:\\s*{[^}]*})?/g;\n\n let match;\n while ((match = imageRegex.exec(contentWindow)) !== null) {\n // Adjust positions to global content positions\n const matchStart = match.index + checkStart;\n const matchEnd = matchStart + match[0].length;\n\n // Check if code range falls within this image\n if (start >= matchStart && end <= matchEnd) {\n // Check if code is in attributes\n const imagePart = match[0];\n // Adjust positions relative to the image part\n const relativeStart = start - matchStart;\n const relativeEnd = end - matchStart;\n const {braceMatch, quoteMatch} = checkImageAttributes(\n imagePart,\n matchStart,\n null,\n relativeStart,\n relativeEnd,\n );\n if (braceMatch || quoteMatch) {\n return true;\n }\n }\n }\n\n // Additional check: if code is in attributes of any image in the document,\n // then it should not be marked as code block\n const codeContent = content.substring(start, end);\n const codeText = codeContent.replace(/`/g, ''); // Remove backticks\n // TODO:goldserg not optimized block (increase time at 6 times)\n // Find all images in the document\n const allImagesRegex = /!\\[[^\\]]*\\]\\([^)]*\\)(?:\\s*\"[^\"]*\")?(?:\\s*{[^}]*})?/gs;\n let imageMatch;\n while ((imageMatch = allImagesRegex.exec(contentWindow)) !== null) {\n // Check if code is in image attributes\n const imagePart = imageMatch[0];\n const {braceMatch, quoteMatch} = checkImageAttributes(\n imagePart,\n imageMatch.index,\n codeText,\n );\n if (braceMatch || quoteMatch) {\n return true;\n }\n }\n\n // Additional check for YFM tables: if code is in one table cell,\n // and image in another cell of the same row, then code should not be marked as code block\n // Check if code is in YFM table context\n let lineIndex = 0;\n let charCount = 0;\n\n // Find the line where the code is located\n for (let i = 0; i < lines.length; i++) {\n if (charCount <= start && start < charCount + lines[i].length + 1) {\n lineIndex = i;\n break;\n }\n charCount += lines[i].length + 1;\n }\n\n // Check if line is in YFM table context\n if (lineIndex > 0 && lineIndex < lines.length - 1) {\n const prevLine = lines[lineIndex - 1];\n const currentLine = lines[lineIndex];\n const nextLine = lines[lineIndex + 1];\n\n // In YFM table, if code is in one cell and image in another,\n // then code should not be marked as code block\n // We need to check if code is in the same line as image\n if (\n prevLine.trim().startsWith('#|') &&\n nextLine.trim().startsWith('|#') &&\n currentLine.includes('\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n// Process inline tokens that may contain inline code\nfunction processInlineToken(\n token: Token,\n lineStarts: number[],\n content: string,\n parentStartPos: number,\n): number {\n if (!token.children || token.children.length === 0) {\n return parentStartPos;\n }\n\n let inlineStartPos = parentStartPos;\n if (token.map && token.map.length === 2) {\n const [startLine] = token.map;\n inlineStartPos = lineToCharPosition(startLine, lineStarts, content);\n }\n\n return inlineStartPos;\n}\n\nexport function resolveBlockCodes(this: LoaderContext, content: string) {\n if (!this.options.mergeContentParts || !content.includes('![')) {\n this.api.blockCodes.set([]);\n return content;\n }\n const md = new MarkdownIt({html: true});\n const diplodocOptions = {\n notesAutotitle: false,\n path: '',\n };\n\n md.use(deflist, diplodocOptions);\n md.use(imsize, diplodocOptions);\n md.use(yfmTable, diplodocOptions);\n\n const tokens = md.parse(content, {});\n\n const codes: Array<[number, number]> = [];\n\n const lines = content.split('\\n');\n const lineStarts = computeLineStarts(lines);\n\n function extractCodeBlocks(\n tokens: Token[],\n parentStartPos = 0,\n parentType: string | null = null,\n ) {\n for (const token of tokens) {\n let currentParentStartPos = parentStartPos;\n\n if (token.type === 'fence' || token.type === 'code_block') {\n processBlockCode(token, lineStarts, lines, content, codes);\n } else if (token.type === 'inline') {\n currentParentStartPos = processInlineToken(\n token,\n lineStarts,\n content,\n currentParentStartPos,\n );\n } else if (token.type === 'code_inline') {\n // Skip code_inline tokens that are children of image tokens\n if (parentType !== 'image') {\n currentParentStartPos = processInlineCode(\n token,\n content,\n currentParentStartPos,\n codes,\n lineStarts,\n lines,\n );\n }\n }\n\n if (token.children && token.children.length > 0) {\n extractCodeBlocks(token.children, currentParentStartPos, token.type);\n }\n }\n }\n\n extractCodeBlocks(tokens);\n\n this.api.blockCodes.set(codes);\n\n return content;\n}\n", "import type {PageContent} from '@diplodoc/page-constructor-extension';\nimport type {LoaderContext} from '../loader';\nimport type {Logger} from '~/core/logger';\n\nimport {dump as yamlDump, load as yamlLoad} from 'js-yaml';\n\nimport {filterBlocksByConditions, hasWhenConditions} from '~/core/utils';\n\nimport {PC_REGEX} from '../utils';\n\ntype Replacement = {\n start: number;\n end: number;\n replacement: string;\n};\n\ntype ProcessOptions = {\n vars: Record<string, unknown>;\n skipMissingVars: boolean;\n logger: Logger;\n path: NormalizedPath;\n};\n\nfunction processPageConstructorBlocks(content: string, options: ProcessOptions): string {\n const {vars, skipMissingVars, logger, path} = options;\n const blocks: Replacement[] = [];\n const openRegex = new RegExp(PC_REGEX.source, PC_REGEX.flags);\n\n let searchStart = 0;\n\n while (searchStart < content.length) {\n const remaining = content.slice(searchStart);\n const match = openRegex.exec(remaining);\n\n if (!match) {\n break;\n }\n\n const indent = match[1] || '';\n const matchIndex = searchStart + match.index;\n const contentStart = matchIndex + match[0].length;\n const closePattern = new RegExp(`^${indent}:::[ \\\\t]*$`, 'm');\n const afterMatch = content.slice(contentStart);\n const closeMatch = closePattern.exec(afterMatch);\n\n if (!closeMatch) {\n searchStart = contentStart;\n continue;\n }\n\n const yamlContent = afterMatch.slice(0, closeMatch.index);\n\n let data: PageContent;\n\n try {\n data = yamlLoad(yamlContent) as PageContent;\n } catch (error) {\n logger.warn(`Failed to parse page-constructor YAML in ${path}: ${error}`);\n searchStart = contentStart;\n continue;\n }\n\n if (!hasWhenConditions(data)) {\n searchStart = contentStart + closeMatch.index + closeMatch[0].length;\n continue;\n }\n\n const filtered = filterBlocksByConditions(data, vars, skipMissingVars);\n const hasBlocks = Array.isArray(filtered.blocks) && filtered.blocks.length > 0;\n\n const blockStart = matchIndex;\n const blockEnd = contentStart + closeMatch.index + closeMatch[0].length;\n\n if (hasBlocks) {\n const yaml = yamlDump(filtered, {\n lineWidth: -1,\n noRefs: true,\n quotingType: \"'\",\n forceQuotes: false,\n });\n\n const indentedYaml = yaml\n .split('\\n')\n .filter((line) => line.trim())\n .map((line) => `${indent}${line}`)\n .join('\\n');\n\n blocks.push({\n start: blockStart,\n end: blockEnd,\n replacement: `${indent}::: page-constructor\\n${indentedYaml}\\n${indent}:::\\n`,\n });\n } else {\n blocks.push({\n start: blockStart,\n end: blockEnd,\n replacement: '',\n });\n }\n\n searchStart = blockEnd;\n }\n\n for (let i = blocks.length - 1; i >= 0; i--) {\n const {start, end, replacement} = blocks[i];\n content = content.slice(0, start) + replacement + content.slice(end);\n }\n\n return content;\n}\n\nexport function resolveConditions(this: LoaderContext, content: string): string {\n const {skipMissingVars = false} = this.options;\n const vars = this.vars || {};\n\n content = processPageConstructorBlocks(content, {\n vars,\n skipMissingVars,\n logger: this.logger,\n path: this.path,\n });\n\n return content;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,SAAQ,iBAAiB,gCAA+B;AAExD,SAAQ,2BAA0B;AAE3B,SAAS,MAAM,MAAc;AAChC,SAAO;AAAA,IACH,UAAU,IAAI,yBAAsC,CAAC,UAAU,GAAG,GAAG,IAAI,WAAW;AAAA,IACpF,SAAS,IAAI,yBAAqC,CAAC,SAAS,GAAG,GAAG,IAAI,UAAU;AAAA,IAChF,QAAQ,IAAI;AAAA,MACR,CAAC,YAAY,QAAQ,MAAM;AAAA,MAC3B,GAAG,IAAI;AAAA,IACX;AAAA,IACA,UAAU,IAAI;AAAA,MACV,CAAC,YAAY,MAAM;AAAA,MACnB,GAAG,IAAI;AAAA,IACX;AAAA,IACA,MAAM,IAAI,gBAA+B,CAAC,OAAO,GAAG,GAAG,IAAI,OAAO;AAAA,EACtE;AACJ;AAEA,IAAM,CAAC,UAAU,SAAS,IAAI,oBAAoB,YAAY,KAAK;;;ACRnE,SAAQ,WAAAA,UAAS,QAAAC,aAAW;AAC5B,SAAQ,iBAAgB;AAExB,SAAQ,SAAS,OAAO,OAAO,OAAO,KAAK,SAAS,UAAU,iBAAAC,sBAAoB;;;ACblF,SAAQ,aAAY;AAEpB,SAAQ,cAAa;;;ACNrB,SAAQ,oBAAoB,kBAAiB;AAE7C,SAAS,uBAA4C,SAAiB;AAClE,SAAO,mBAAmB,SAAS,EAAC,MAAM,KAAI,CAAC;AACnD;AAEO,SAAS,kBAAuC,YAAoB;AACvE,QAAM,EAAC,MAAM,QAAO,IAAI;AACxB,QAAM,EAAC,cAAa,IAAI;AAExB,QAAM,CAAC,aAAa,SAAS,cAAc,IAAI,uBAAuB,KAAK,MAAM,UAAU;AAE3F,MAAI,CAAC,gBAAgB;AACjB,SAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AACpB,WAAO;AAAA,EACX;AAEA,MAAI,eAAe;AACf,SAAK,IAAI,KAAK,IAAI,WAAW;AAAA,EACjC,OAAO;AACH,SAAK,IAAI,KAAK,IAAI,WAAW,KAAK,MAAM,aAAa,IAAI,CAAC;AAAA,EAC9D;AAEA,OAAK,UAAU,OAAO,GAAG,cAAc;AAEvC,SAAO;AACX;;;AC1BA,SAAQ,gBAAgB,qBAAoB;AAErC,SAAS,gBAAqC,YAAoB;AACrE,QAAM,EAAC,MAAM,QAAO,IAAI;AACxB,QAAM,EAAC,cAAa,IAAI;AAExB,MAAI,eAAe;AACf,WAAO;AAAA,EACX;AAEA,MAAI;AAEJ,MAAI,KAAK,SAAS,aAAa;AAC3B,cAAU,eAAe,KAAK,MAAM,YAAY,IAAI;AAAA,EACxD,OAAO;AACH,cAAU,cAAc,KAAK,MAAM,YAAY,MAAM,KAAK,SAAS;AAAA,EACvE;AAEA,SAAO;AACX;;;ACnBO,SAAS,gBAAqC,SAAiB;AAClE,QAAM,oBAAoB;AAC1B,QAAM,WAAW,CAAC;AAElB,MAAI;AAEJ,SAAQ,QAAQ,kBAAkB,KAAK,OAAO,GAAI;AAC9C,aAAS,KAAK,CAAC,MAAM,OAAO,kBAAkB,SAAS,CAAqB;AAAA,EAChF;AAEA,OAAK,IAAI,SAAS,IAAI,QAAQ;AAE9B,SAAO;AACX;;;ACZA,SAAQ,SAAS,YAAW;AAE5B,SAAQ,eAAe,iBAAAC,gBAAe,kBAAiB;;;ACFvD,SAAQ,QAAQ,gBAAe;AAE/B,SAAQ,eAAe,eAAe,iBAAgB;AAItD,IAAM,YAAY,EAAC,KAAK,SAAS,KAAK,SAAS,IAAI,OAAM;AAElD,SAAS,SAAS,SAAqC;AAC1D,QAAM,KAAK;AACX,QAAM,QAAQ,GAAG,KAAK,OAAO;AAC7B,MAAI,CAAC,OAAO;AACR,WAAO;AAAA,EACX;AAEA,QAAM,OAAO,qBAAqB,SAAS,GAAG,SAAS;AAEvD,MAAI,SAAS,QAAQ,KAAK,MAAM,OAAO,GAAG;AACtC,WAAO;AAAA,EACX;AAEA,KAAG,aAAa,KAAK,SAAS;AAE9B,SAAO;AACX;AAEO,SAAS,cAAc,OAA4C;AACtE,QAAM,SAAmB,CAAC;AAE1B,MAAI,CAAC,OAAO;AACR,WAAO;AAAA,EACX;AAEA,MAAI,OAAO,UAAU,UAAU;AAC3B,UAAM,eAAe,MAAM,KAAK;AAEhC,QAAI,cAAc,KAAK,YAAY,KAAK,aAAa,MAAM,KAAK,EAAE,WAAW,GAAG;AAC5E,aAAO,KAAK,YAAY;AAAA,IAC5B;AAEA,WAAO;AAAA,EACX;AAEA,YAAU,OAAO,CAAC,UAAU;AACxB,QAAI,cAAc,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,EAAE,WAAW,GAAG;AAC9D,aAAO,KAAK,KAAK;AAAA,IACrB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;AAEO,SAAS,cAAc,SAA6B,CAAC,GAAG,SAAmB,CAAC,GAAa;AAC5F,aAAW,SAAS,QAAQ;AACxB,WAAO,KAAK,GAAG,cAAc,KAAK,CAAC;AAAA,EACvC;AAEA,SAAO;AACX;AAEO,SAAS,eAAe,UAA0B;AACrD,QAAM,OAAO,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AAE1C,SAAO,KAAK,QAAQ,YAAY,EAAE;AACtC;AAEO,IAAM,WAAW;AAEjB,SAAS,aAAa,SAA8B;AACvD,QAAM,WAAwB,CAAC;AAC/B,QAAM,YAAY,IAAI,OAAO,SAAS,QAAQ,SAAS,KAAK;AAE5D,MAAI,cAAc;AAElB,SAAO,cAAc,QAAQ,QAAQ;AACjC,UAAM,YAAY,QAAQ,MAAM,WAAW;AAC3C,UAAM,QAAQ,UAAU,KAAK,SAAS;AAEtC,QAAI,CAAC,OAAO;AACR;AAAA,IACJ;AAEA,UAAM,SAAS,MAAM,CAAC,KAAK;AAC3B,UAAM,aAAa,cAAc,MAAM;AACvC,UAAM,WAAW,aAAa,MAAM,CAAC,EAAE;AACvC,UAAM,aAAa,IAAI,OAAO,IAAI,MAAM,eAAe,GAAG;AAC1D,UAAM,aAAa,QAAQ,MAAM,QAAQ;AACzC,UAAM,aAAa,WAAW,KAAK,UAAU;AAE7C,QAAI,CAAC,YAAY;AACb,oBAAc;AACd;AAAA,IACJ;AAEA,UAAM,WAAW,WAAW,MAAM,GAAG,WAAW,KAAK;AACrD,QAAI;AAEJ,QAAI;AACA,aAAO,SAAS,QAAQ;AAAA,IAC5B,QAAQ;AACJ,oBAAc;AACd;AAAA,IACJ;AAEA,UAAM,SAAS,cAAc,MAAM,QAA8B,CAAC,CAAC;AAEnE,eAAW,OAAO,QAAQ;AACtB,YAAM,SAAS,cAAc,GAAG;AAEhC,UAAI,CAAC,QAAQ;AACT;AAAA,MACJ;AAEA,YAAM,WAAW,WAAW,WAAW,QAAQ,WAAW,CAAC,EAAE;AAE7D,eAAS,KAAK;AAAA,QACV,GAAG;AAAA,QACH,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO,eAAe,GAAG;AAAA,QACzB,WAAW;AAAA,QACX,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU,CAAC,YAAY,QAAQ;AAAA;AAAA,QAE/B,SAAS,EAAC,OAAO,QAAW,QAAQ,QAAW,QAAQ,MAAK;AAAA,MAChE,CAAC;AAAA,IACL;AAEA,kBAAc,WAAW,WAAW,QAAQ,WAAW,CAAC,EAAE;AAAA,EAC9D;AAEA,SAAO;AACX;AAEO,SAAS,cAAc,SAA8B;AACxD,QAAM,QAAQ,KAAK,WAAW,SAAS,CAAC,OAAO,OAAO;AAClD,UAAM,OAAO,qBAAqB,SAAS,GAAG,SAAS;AACvD,UAAM,QAAQ,eAAe,SAAS,GAAG,YAAY,MAAM,CAAC,EAAE,MAAM;AACpE,UAAM,UAAU,iBAAiB,SAAS,GAAG,aAAa,MAAM,UAAU,KAAK,CAAC;AAGhF,QAAI,SAAS,QAAQ,UAAU,QAAQ,KAAK,MAAM,OAAO,GAAG;AACxD,aAAO;AAAA,IACX;AAEA,UAAM,SAAS,cAAc,IAAI;AACjC,QAAI,CAAC,QAAQ;AACT,aAAO;AAAA,IACX;AAEA,UAAM,WAAW,QACb,GAAG,YAAY,MAAM,CAAC,EAAE,SAAS,MAAM,SAAS,CACpD;AACA,UAAM,OAAO,UAAU,QAAQ,KAAK;AAEpC,OAAG,aAAa,KAAK,SAAS;AAE9B,WAAO;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA,SAAS,SAAS,UAAU,UAAU;AAAA,MACtC;AAAA,MACA,WAAW,SAAS,WAAW,CAAC,SAAS,UAAU;AAAA,MACnD;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,QAAM,iBAAiB,KAAK,WAAW,SAAS,CAAC,OAAO,OAAO;AAC3D,QAAI,OAAO,qBAAqB,SAAS,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC;AACjE,QAAI,QAAQ,eAAe,SAAS,GAAG,YAAY,MAAM,CAAC,EAAE,MAAM;AAClE,UAAM,UAAU,iBAAiB,SAAS,GAAG,aAAa,MAAM,UAAU,KAAK,CAAC;AAGhF,QAAK,SAAS,QAAQ,UAAU,QAAS,MAAM,MAAM,OAAO,GAAG;AAC3D,aAAO;AAAA,IACX;AACA,YAAQ,SAAS;AACjB,WAAO,QAAQ;AAEf,UAAM,SAAS,cAAc,IAAI;AACjC,QAAI,CAAC,QAAQ;AACT,aAAO;AAAA,IACX;AAEA,UAAM,WAAW,QACb,GAAG,YAAY,MAAM,CAAC,EAAE,SAAS,MAAM,SAAS,CACpD;AACA,UAAM,OAAO,UAAU,QAAQ,KAAK;AAEpC,OAAG,cAAc,QAAQ,GAAG,SAAS,MAAM,MAAM,IAAI,KAAK,UAAU;AAEpE,WAAO;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA,SAAS;AAAA,MACT,MAAM;AAAA,MACN;AAAA,MACA,WAAW,SAAS,WAAW,CAAC,SAAS,UAAU;AAAA,MACnD;AAAA,IACJ;AAAA,EACJ,CAAC;AAED,SAAO,CAAC,GAAG,OAAO,GAAG,cAAc;AACvC;AAEO,SAAS,SAAS,SAA8B;AACnD,SAAO,KAAK,8BAA8B,SAAS,CAAC,UAAU;AAC1D,UAAM,SAAS,cAAc,MAAM,CAAC,CAAC;AACrC,QAAI,CAAC,QAAQ;AACT,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,MACH,GAAG;AAAA,MACH,MAAM;AAAA,MACN,MAAM,MAAM,CAAC,KAAK;AAAA,MAClB,OAAO;AAAA,MACP,WAAW;AAAA,IACf;AAAA,EACJ,CAAC;AACL;AAEA,SAAS,KACL,SACA,SACA,KACW;AACX,QAAM,QAAqB,CAAC;AAE5B,MAAI;AAEJ,SAAQ,QAAQ,QAAQ,KAAK,OAAO,GAAI;AACpC,UAAM,SAAS,IAAI,OAAO,OAAO;AACjC,QAAI,CAAC,QAAQ;AACT;AAAA,IACJ;AAEA,QAAI,QAAQ;AACR,YAAM,KAAK;AAAA,QACP,GAAG;AAAA,QACH,UAAU,CAAC,MAAM,OAAO,QAAQ,SAAS;AAAA,MAC7C,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,qBAAqB,KAAa,OAAe,UAAU,CAAC,KAAK,GAAG,GAAG;AAC5E,QAAM,MAAM,IAAI;AAChB,QAAM,CAAC,aAAa,SAAS,IAAI,QAAQ,IAAI,CAAC,WAAW,OAAO,WAAW,CAAC,CAAC;AAE7E,MAAI,MACA,QAAQ,GACR,MAAM;AAEV,MAAI,IAAI,WAAW,GAAG,MAAM,IAAc;AACtC,WAAO,gBAAgB,KAAK,QAAQ,CAAC;AAAA,EACzC;AAEA,SAAO,MAAM,KAAK;AACd,WAAO,IAAI,WAAW,GAAG;AAEzB,QAAI,SAAS,IAAM;AACf;AAAA,IACJ;AAGA,QAAI,OAAO,MAAQ,SAAS,KAAM;AAC9B;AAAA,IACJ;AAEA,QAAI,SAAS,MAAgB,MAAM,IAAI,KAAK;AACxC,UAAI,IAAI,WAAW,MAAM,CAAC,MAAM,IAAM;AAClC;AAAA,MACJ;AACA,aAAO;AACP;AAAA,IACJ;AAEA,QAAI,SAAS,aAA0B;AACnC;AACA,UAAI,QAAQ,IAAI;AACZ,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,QAAI,SAAS,WAAwB;AACjC,UAAI,UAAU,GAAG;AACb;AAAA,MACJ;AACA;AAAA,IACJ;AAEA;AAAA,EACJ;AAEA,MAAI,UAAU,KAAK;AACf,WAAO;AAAA,EACX;AACA,MAAI,UAAU,GAAG;AACb,WAAO;AAAA,EACX;AAEA,SAAO,IAAI,MAAM,OAAO,GAAG;AAC/B;AAEA,SAAS,eAAe,KAAa,OAAe;AAChD,MAAI,MACA,MACA,QAAQ,GACR,MAAM;AAEV,SAAO,OAAO,GAAG;AACb,WAAO,IAAI,WAAW,GAAG;AACzB,WAAO,IAAI,WAAW,MAAM,CAAC;AAG7B,QAAI,OAAO,MAAQ,SAAS,KAAM;AAC9B;AAAA,IACJ;AAEA,QAAI,SAAS,IAAc;AACvB,aAAO;AACP;AAAA,IACJ;AAEA,QAAI,SAAS,IAAY;AACrB;AACA,UAAI,QAAQ,IAAI;AACZ,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,QAAI,SAAS,IAAY;AACrB,UAAI,UAAU,GAAG;AACb;AAAA,MACJ;AACA;AAAA,IACJ;AAEA;AAAA,EACJ;AAEA,SAAO,IAAI,MAAM,MAAM,GAAG,KAAK;AACnC;AAEA,SAAS,iBAAiB,KAAa,OAA6B;AAChE,QAAM,MAAM,IAAI;AAChB,QAAM,UAAwB;AAAA,IAC1B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACZ;AACA,MAAI,MACA,QAAQ,GACR,MAAM,OACN,cAAc;AAElB,MAAI,IAAI,MAAM,CAAC,MAAM,KAAK;AACtB;AAAA,EACJ;AACA,MAAI,IAAI,WAAW,GAAG,MAAM,OAAgB,UAAU,GAAG;AACrD,WAAO;AAAA,EACX;AAEA,SAAO,MAAM,KAAK;AACd,WAAO,IAAI,WAAW,GAAG;AAEzB,QAAI,SAAS,MAAgB,UAAU,IAAI;AACvC,UAAI,IAAI,WAAW,MAAM,CAAC,MAAM,KAAM;AAClC,eAAO;AAAA,MACX;AACA;AAAA,IACJ;AAEA,QAAI,SAAS,OAAgB,QAAQ,IAAI;AACrC;AACA,oBAAc,MAAM;AACpB,UAAI,QAAQ,IAAI;AACZ,eAAO;AAAA,MACX;AAAA,IACJ;AAEA,QAAI,SAAS,KAAc;AACvB,UAAI,UAAU,GAAG;AACb;AACA;AAAA,MACJ;AACA;AAAA,IACJ;AAEA;AAAA,EACJ;AAEA,MAAI,UAAU,OAAO,UAAU,GAAG;AAC9B,WAAO;AAAA,EACX;AAEA,QAAM,YAAY;AAClB,QAAM,gBAAgB,IAAI,MAAM,aAAa,GAAG;AAChD,MAAI;AAEJ,UAAQ,QAAQ,UAAU,KAAK,aAAa,OAAO,MAAM;AACrD,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,QAAQ,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC;AAE7C,QAAI,QAAQ,UAAU;AAClB,cAAQ,GAAG,IAAI,UAAU;AAAA,IAC7B,OAAO;AACH,cAAQ,GAAG,IAAI;AAAA,IACnB;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,gBAAgB,KAAa,OAAe;AACjD,QAAM,MAAM,IAAI;AAEhB,MAAI,MACA,MAAM;AAEV,SAAO,MAAM,KAAK;AACd,WAAO,IAAI,WAAW,GAAG;AACzB,QAAI,SAAS,IAAe;AACxB,aAAO;AAAA,IACX;AACA,QAAI,SAAS,IAAc;AACvB,aAAO;AAAA,IACX;AACA,QAAI,SAAS,IAAc;AACvB,aAAO,IAAI,MAAM,OAAO,GAAG;AAAA,IAC/B;AACA,QAAI,SAAS,MAAgB,MAAM,IAAI,KAAK;AACxC,aAAO;AACP;AAAA,IACJ;AAEA;AAAA,EACJ;AAGA,SAAO;AACX;AAEO,SAAS,aACZ,UACA,OACG;AACH,QAAM,WAAW,CAAC,SAAmB,UAAoB;AACrD,WACK,QAAQ,CAAC,KAAK,MAAM,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAM,CAAC,KAC/C,QAAQ,CAAC,KAAK,MAAM,CAAC,KAAK,QAAQ,CAAC,IAAI,MAAM,CAAC,KAC9C,QAAQ,CAAC,IAAI,MAAM,CAAC,KAAK,QAAQ,CAAC,KAAK,MAAM,CAAC;AAAA,EAEvD;AAEA,SAAO,MAAM,OAAO,CAAC,SAAS;AAC1B,WAAO,CAAC,SAAS,KAAK,CAAC,YAAY,SAAS,SAAS,KAAK,QAAQ,CAAC;AAAA,EACvE,CAAC;AACL;AAEO,SAAS,aAAa,SAAiB;AAC1C,QAAM,UAAU,CAAC;AACjB,QAAM,gBAAgB,QAAQ,MAAM,KAAK;AACzC,QAAM,mBAAmB,QAAQ,QAAQ,SAAS,CAAC;AACnD,QAAM,kBAAkB,CAAC,KAAK,GAAG;AACjC,QAAM,QAAQ,gBACR,cAAc,CAAC,EAAE,SACjB,gBAAgB,QAAQ,gBAAgB,IAAI;AAElD,MAAI,eAAe;AACf,cAAU,QAAQ,QAAQ,UAAU,EAAE;AAAA,EAC1C,OAAO;AACH,cAAU,QAAQ,QAAQ,YAAY,EAAE;AAAA,EAC5C;AAEA,QAAM,SAAS;AAEf,MAAI;AAEJ,SAAQ,QAAQ,OAAO,KAAK,OAAO,GAAI;AACnC,YAAQ,KAAK,MAAM,CAAC,CAAC;AACrB,cAAU,QAAQ,QAAQ,MAAM,CAAC,GAAG,EAAE;AACtC,WAAO,aAAa,MAAM,CAAC,EAAE;AAAA,EACjC;AAEA,QAAM,QAAQ,QAAQ,KAAK;AAE3B,SAAO,EAAC,SAAS,OAAO,MAAK;AACjC;;;ADteO,SAAS,oBAAyC,SAAiB;AACtE,QAAM,WAAW,CAAC;AAClB,QAAM,UAAU,CAAC,GAAG,KAAK,IAAI,SAAS,IAAI,CAAC;AAI3C,QAAM,mBAAmB;AAEzB,MAAI;AAEJ,SAAQ,QAAQ,iBAAiB,KAAK,OAAO,GAAI;AAG7C,QAAI,QAAQ,MAAM,QAAQ,CAAC,MAAM,KAAK;AAClC;AAAA,IACJ;AAEA,UAAM,OAAO,SAAS,MAAM,CAAC,CAAC;AAE9B,UAAM,UAAUC,eAA2B,IAAI;AAE/C,QAAI,WAAW,QAAQ,MAAM;AACzB,YAAM,cAAc,KAAK;AACzB,YAAM,wBAAwB,cAAc,KAAK,QAAQ,WAAW,GAAG,QAAQ,IAAI,CAAC;AAEpF,UAAI,0BAA0B,aAAa;AACvC,aAAK,OAAO,MAAM,UAAU,GAAG,WAAW,kCAAkC;AAE5E;AAAA,MACJ;AAEA,cAAQ,OAAO,WAAW,aAAa,QAAQ,IAAoB;AACnE,cAAQ,OAAO;AACf,cAAQ,QAAQ,QAAQ,MAAM,MAAM,OAAO,iBAAiB,SAAS;AACrE,cAAQ,WAAW,CAAC,MAAM,OAAO,iBAAiB,SAAS;AAE3D,eAAS,KAAK,OAAO;AAAA,IACzB;AAAA,EACJ;AAEA,OAAK,IAAI,KAAK,IAAI,aAAa,SAAS,QAAQ,CAAC;AAEjD,SAAO;AACX;;;AEjDA,SAAQ,QAAAC,aAAW;AAEnB,SAAQ,IAAI,iBAAAC,gBAAe,cAAAC,mBAAiB;AAI5C,SAAS,mBAAmB,MAAoB,eAA8B;AAC1E,MAAI,UAAU;AACd,QAAM,gBAAgBC,eAAc,IAAI,EAAE,MAAM,GAAG;AACnD,QAAM,qBAAqB,cAAc,OAAO,CAAC,SAAiB,SAAS,IAAI,EAAE;AACjF,MAAI;AAEJ,WAAS,IAAI,GAAG,KAAK,oBAAoB,KAAK;AAC1C,QAAI;AACA,yBAAmBA;AAAA,QACfC,MAAK,cAAc,OAAO,cAAc,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,MAC9D;AACA,SAAG,aAAa,gBAAgB;AAChC,UAAI,IAAI,GAAG;AACP,kBAAUD,eAAc,cAAc,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AACxD,sBAAc,OAAO,MAAM,uBAAuB,IAAI;AAAA,6BACzC,OAAO,EAAE;AAAA,MAC1B;AACA,aAAO;AAAA,IACX,QAAQ;AACJ,UAAI,MAAM,qBAAqB,GAAG;AAC9B,eAAO;AAAA,MACX,OAAO;AACH;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,QACL,MACA,eACA,YACF;AACE,MAAI,SAAS,MAAM;AACf,WAAO;AAAA,EACX;AACA,MAAI,WAAW,IAAI,IAAI,GAAG;AACtB,WAAO,WAAW,IAAI,IAAI;AAAA,EAC9B;AAEA,MAAI;AACA,UAAM,YAAY,mBAAmB,MAAM,aAAa;AACxD,UAAME,YAAW,cAAc,SAAS,SAAS;AACjD,UAAM,OAAO,GAAG,SAASA,SAAQ,EAAE;AACnC,eAAW,IAAI,MAAM,IAAI;AACzB,WAAO;AAAA,EACX,QAAQ;AACJ,eAAW,IAAI,MAAM,CAAC;AACtB,WAAO;AAAA,EACX;AACJ;AAEO,SAAS,cAAmC,SAAiB;AAChE,QAAM,SAAsB,CAAC;AAC7B,QAAM,aAAa,oBAAI,IAA0B;AAEjD,QAAM,UAAU;AAAA,IACZ,GAAG,KAAK,IAAI,KAAK,IAAI,EAAE,IAAI,CAAC,EAAC,SAAQ,MAAM,QAAQ;AAAA,IACnD,GAAG,KAAK,IAAI,SAAS,IAAI;AAAA,IACzB,GAAG,KAAK,IAAI,WAAW,IAAI;AAAA,EAC/B;AAEA,QAAM,OAAO,aAAa,SAAS,SAAS,OAAO,CAAC;AACpD,QAAM,QAAQ,aAAa,SAAS,cAAc,OAAO,CAAC;AAC1D,QAAM,WAAW,aAAa,SAAS,aAAa,OAAO,CAAC;AAE5D,aAAW,QAAQ,CAAC,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG;AACjD,QAAI;AACA,UAAI,KAAK,SAAS,QAAQ,CAAC,KAAK,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,MAAM,SAAS,GAAG,GAAG;AAChF,aAAK,OAAOC,YAAW,KAAK,MAAM,mBAAmB,KAAK,IAAI,CAAiB;AAAA,MACnF;AAEA,UAAI,OAAO;AACX,UAAI,CAAC,OAAO,OAAO,EAAE,SAAS,KAAK,IAAI,KAAK,KAAK,YAAY,SAAS;AAClE,eAAO,QAAQ,KAAK,MAAM,MAAM,UAAU;AAAA,MAC9C;AAEA,aAAO,KAAK,EAAC,GAAG,MAAM,KAAI,CAAC;AAAA,IAC/B,SAAS,OAAO;AACZ,WAAK,OAAO,KAAK,+BAA+B,KAAK,IAAI,OAAO,KAAK,IAAI,KAAK,KAAK,EAAE;AAAA,IACzF;AAAA,EACJ;AAEA,OAAK,IAAI,OAAO,IAAI,CAAC,GAAG,MAAM,CAAC;AAE/B,SAAO;AACX;;;AC3FO,SAAS,gBAAqC,SAAiB;AAClE,QAAM,WAAW,CAAC;AAClB,QAAM,UAAU,CAAC,GAAG,KAAK,IAAI,SAAS,IAAI,CAAC;AAE3C,QAAM,UAAU;AAEhB,MAAI;AAEJ,SAAQ,QAAQ,QAAQ,KAAK,OAAO,GAAI;AACpC,UAAM,CAAC,QAAQ,QAAQ,IACnB,MAAM,CAAC,MAAM,MACP,kBAAkB,MAAM,OAAO,OAAO,IACtC,qBAAqB,MAAM,OAAO,OAAO;AAEnD,QAAI,QAAQ;AACR,eAAS,KAAK,EAAC,SAAS,QAAQ,SAAQ,CAAC;AACzC,cAAQ,YAAY,SAAS,CAAC;AAAA,IAClC;AAAA,EACJ;AAEA,OAAK,IAAI,SAAS,IAAI,aAAa,SAAS,QAAQ,CAAC;AAErD,SAAO;AACX;AAEA,IAAM,QAAQ;AAEd,SAAS,kBAAkB,OAAe,SAA+C;AACrF,MAAI,QAAQ;AAEZ,MAAI,QAAQ;AACZ,SAAO,QAAQ,QAAQ,QAAQ;AAC3B,QAAI,QAAQ,QAAQ,GAAG;AACnB,aAAO,CAAC;AAAA,IACZ;AAEA,QAAI,QAAQ,KAAK,MAAM,KAAK;AACxB;AAAA,IACJ,WAAW,QAAQ,KAAK,EAAE,MAAM,KAAK,GAAG;AACpC;AAAA,IACJ,OAAO;AACH,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AAEA,SAAO,QAAQ,QAAQ,QAAQ;AAC3B,QAAI,QAAQ,QAAQ,CAAC,KAAK,QAAQ,KAAK,MAAM,MAAM;AAC/C,eAAS,QAAQ,KAAK;AACtB;AAAA,IACJ,WAAW,MAAM,KAAK,GAAG;AACrB,aAAO,CAAC,QAAQ,MAAM,OAAO,KAAK,GAAG,CAAC,OAAO,KAAK,CAAC;AAAA,IACvD,OAAO;AACH,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AAEA,SAAO,CAAC;AACZ;AAEA,SAAS,qBAAqB,OAAe,SAA+C;AACxF,QAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAM,UAAU,CAAC;AAEjB,MAAI,QAAQ;AAEZ,MAAI,MAAM;AACV,SAAO,MAAM,QAAQ,QAAQ;AACzB,QAAI,QAAQ,GAAG,MAAM,OAAO;AACxB;AAAA,IACJ,WAAW,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,MAAM,CAAC,GAAG;AACnD;AAAA,IACJ,OAAO;AACH,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AAEA,MAAI,QAAQ,QAAQ;AACpB,SAAO,SAAS,GAAG;AACf,UAAM,iBAAiB,CAAC;AACxB,UAAM,eAAe,QAAQ,WAAW,KAAK,CAAC,QAAQ,MAAM,GAAG,OAAO,EAAE,KAAK;AAE7E,QAAI,QAAQ,UAAU,CAAC,cAAc;AACjC,cAAQ,SAAS;AAAA,IACrB;AAEA,QAAI,CAAC,cAAc;AACf,cAAQ,QAAQ,KAAK,IAAI;AAAA,IAC7B;AAEA,QAAI,kBAAkB,cAAc;AAChC,YAAM,QAAQ,MAAM,UAAU;AAC9B,UAAI,OAAO;AACP,eAAO,CAAC,QAAQ,MAAM,QAAQ,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,MAAM,QAAQ,GAAG,CAAC;AAAA,MACjF,OAAO;AACH,eAAO,CAAC;AAAA,MACZ;AAAA,IACJ;AAEA,QAAI,QAAQ,KAAK,MAAM,MAAM;AACzB,cAAQ,QAAQ,KAAK;AAAA,IACzB;AAEA;AAAA,EACJ;AAEA,SAAO,CAAC;AACZ;;;AC7GO,SAAS,mBAAwC,SAAiB;AACrE,MAAI,KAAK,SAAS,aAAa;AAC3B,WAAO;AAAA,EACX;AAEA,YAAU,2BAA2B,OAAO;AAE5C,YAAU,2BAA2B,OAAO;AAE5C,YAAU,wBAAwB,OAAO;AAEzC,SAAO;AACX;AAEA,SAAS,2BAA2B,SAAyB;AACzD,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,SAAS,CAAC;AAEhB,QAAM,QAAQ,CAAC;AAEf,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,UAAM,OAAO,MAAM,CAAC;AAEpB,QAAI,KAAK,KAAK,EAAE,WAAW,KAAK,GAAG;AAC/B,YAAM,gBAAgB,KAAK,KAAK;AAEhC,UAAI,kBAAkB,OAAO;AACzB,YAAI,MAAM,SAAS,GAAG;AAClB,gBAAM,gBAAgB,MAAM,IAAI;AAEhC,cAAI,kBAAkB,kBAAkB,MAAM,WAAW,GAAG;AACxD;AAAA,UACJ;AAEA,iBAAO,KAAK,IAAI;AAAA,QACpB;AAAA,MACJ,OAAO;AACH,cAAM,iBAAiB,cAAc,MAAM,iBAAiB;AAC5D,cAAM,gBAAgB,iBAAiB,eAAe,CAAC,IAAI;AAE3D,YAAI,kBAAkB,gBAAgB;AAClC,gBAAM,KAAK,cAAc;AACzB;AAAA,QACJ,OAAO;AACH,gBAAM,KAAK,aAAa;AACxB,iBAAO,KAAK,IAAI;AAAA,QACpB;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,aAAO,KAAK,IAAI;AAAA,IACpB;AAAA,EACJ;AAEA,SAAO,OAAO,KAAK,IAAI;AAC3B;AAEA,SAAS,2BAA2B,SAAyB;AACzD,QAAM,aAAa;AAEnB,SAAO,QAAQ,QAAQ,YAAY,CAAC,GAAG,iBAAiB;AACpD,WAAO;AAAA,EACX,CAAC;AACL;AAEA,SAAS,wBAAwB,SAAyB;AACtD,QAAM,cAAc;AAEpB,SAAO,QAAQ,QAAQ,aAAa,CAAC,GAAG,iBAAiB;AACrD,WAAO;AAAA,EACX,CAAC;AACL;;;ACrEA,OAAO,gBAAgB;AAEvB,OAAO,aAAa;AACpB,OAAO,YAAY;AACnB,OAAO,cAAc;AAErB,SAAS,kBAAkB,OAA2B;AAClD,QAAM,aAAuB,CAAC,CAAC;AAC/B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,UAAM,mBAAmB;AACzB,eAAW,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9D;AACA,SAAO;AACX;AAEA,IAAM,qBAAqB,CAAC,MAAc,YAAsB,YAC5D,QAAQ,WAAW,SAAS,QAAQ,SAAS,WAAW,IAAI;AAEhE,SAAS,qBACL,SACA,YACA,OACA,SACM;AACN,MAAI,MAAM,QAAQ;AAClB,MAAI,WAAW,WAAW,QAAQ;AAC9B,UAAM,YAAY,IAAI,IAAI,WAAW,UAAU,CAAC,IAAI,MAAM,UAAU,CAAC,EAAE;AAAA,EAC3E;AACA,SAAO,WAAW,MAAM,UAAU,UAAU,IAAI,MAAM,IAAI;AAC9D;AAGA,SAAS,iBACL,OACA,YACA,OACA,SACA,OACF;AACE,MAAI,CAAC,MAAM,OAAO,MAAM,IAAI,WAAW,GAAG;AACtC;AAAA,EACJ;AAEA,QAAM,CAAC,WAAW,OAAO,IAAI,MAAM;AAEnC,QAAM,QAAQ,mBAAmB,WAAW,YAAY,OAAO;AAE/D,MAAI;AACJ,MAAI,MAAM,SAAS,WAAW,WAAW,MAAM,QAAQ;AACnD,UAAM,iBAAiB,MAAM,UAAU,CAAC,KAAK;AAC7C,UAAM,gBAAgB,eAAe,QAAQ,MAAM,MAAM;AACzD,QAAI,gBAAgB,IAAI;AACpB,YAAM,YAAY,WAAW,UAAU,CAAC,KAAK;AAC7C,YAAM,cAAc,YAAY,gBAAgB,MAAM,OAAO;AAC7D,oBAAc;AAAA,IAClB,OAAO;AACH,oBAAc,qBAAqB,SAAS,YAAY,OAAO,OAAO;AAAA,IAC1E;AAAA,EACJ,OAAO;AACH,kBAAc,qBAAqB,SAAS,YAAY,OAAO,OAAO;AAAA,EAC1E;AAEA,QAAM,KAAK,CAAC,OAAO,WAAW,CAAC;AACnC;AAGA,SAAS,eACL,WACA,YACA,UACA,OACA,KACA,OACA,cACO;AACP,QAAM,QAAQ,UAAU,MAAM,KAAK;AACnC,MAAI,OAAO;AACP,QAAI,aAAa,MAAM;AAEnB,UAAI,MAAM,CAAC,EAAE,SAAS,QAAQ,GAAG;AAC7B,eAAO;AAAA,MACX;AAAA,IACJ,WAAW,UAAU,UAAa,QAAQ,QAAW;AAEjD,YAAM,YAAY,aAAa,YAAY,SAAS;AACpD,YAAM,UAAU,YAAY,MAAM,CAAC,EAAE;AACrC,UAAI,SAAS,aAAa,OAAO,SAAS;AACtC,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ;AACA,SAAO;AACX;AAGA,SAAS,qBACL,WACA,YACA,UACA,OACA,KAC0C;AAE1C,QAAM,aAAa;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAACC,aAAYC,eAAcD,cAAaC,WAAU,QAAQ,GAAG;AAAA,EACjE;AAGA,QAAM,aAAa;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAACD,aAAYC,eAAcD,cAAaC,WAAU,QAAQ,GAAG;AAAA,EACjE;AAEA,SAAO,EAAC,YAAY,WAAU;AAClC;AAGA,SAAS,yBACL,YACA,UACA,SACA,OACA,gBACA,OACM;AAEN,QAAM,cAAc,wBAAwB,SAAS,YAAY,UAAU,KAAK;AAChF,MAAI,CAAC,aAAa;AACd,UAAM,KAAK,CAAC,YAAY,QAAQ,CAAC;AAAA,EACrC;AAGA,SAAO,cAAc,iBAAiB,KAAK,IAAI,gBAAgB,QAAQ;AAC3E;AAGA,SAAS,kBACL,OACA,SACA,gBACA,OACA,YACA,OACM;AACN,MAAI,CAAC,MAAM,UAAU,CAAC,MAAM,SAAS;AACjC,WAAO;AAAA,EACX;AAGA,MAAI,MAAM,OAAO,MAAM,IAAI,WAAW,GAAG;AACrC,UAAM,CAAC,WAAW,QAAQ,IAAI,MAAM;AACpC,UAAM,QAAQ,mBAAmB,WAAW,YAAY,OAAO;AAG/D,UAAM,cAAc,MAAM,SAAS,KAAK;AACxC,UAAM,gBAAgB,MAAM,SAAS,MAAM,UAAU,MAAM;AAC3D,UAAM,eAAe,YAAY,QAAQ,aAAa;AAEtD,QAAI,iBAAiB,IAAI;AACrB,YAAM,aAAa,QAAQ;AAC3B,YAAM,WAAW,aAAa,cAAc;AAE5C,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,OAAO;AACH,UAAM,gBAAgB,MAAM,SAAS,MAAM,UAAU,MAAM;AAC3D,UAAM,aAAa,QAAQ,QAAQ,eAAe,cAAc;AAEhE,QAAI,eAAe,IAAI;AACnB,YAAM,WAAW,aAAa,cAAc;AAE5C,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAGA,SAAS,wBACL,SACA,OACA,KACA,OACO;AAEP,QAAM,aAAa;AACnB,QAAM,aAAa,KAAK,IAAI,GAAG,QAAQ,UAAU;AACjD,QAAM,WAAW,KAAK,IAAI,QAAQ,QAAQ,MAAM,UAAU;AAC1D,QAAM,gBAAgB,QAAQ,UAAU,YAAY,QAAQ;AAG5D,QAAM,aAAa;AAEnB,MAAI;AACJ,UAAQ,QAAQ,WAAW,KAAK,aAAa,OAAO,MAAM;AAEtD,UAAM,aAAa,MAAM,QAAQ;AACjC,UAAM,WAAW,aAAa,MAAM,CAAC,EAAE;AAGvC,QAAI,SAAS,cAAc,OAAO,UAAU;AAExC,YAAM,YAAY,MAAM,CAAC;AAEzB,YAAM,gBAAgB,QAAQ;AAC9B,YAAM,cAAc,MAAM;AAC1B,YAAM,EAAC,YAAY,WAAU,IAAI;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AACA,UAAI,cAAc,YAAY;AAC1B,eAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ;AAIA,QAAM,cAAc,QAAQ,UAAU,OAAO,GAAG;AAChD,QAAM,WAAW,YAAY,QAAQ,MAAM,EAAE;AAG7C,QAAM,iBAAiB;AACvB,MAAI;AACJ,UAAQ,aAAa,eAAe,KAAK,aAAa,OAAO,MAAM;AAE/D,UAAM,YAAY,WAAW,CAAC;AAC9B,UAAM,EAAC,YAAY,WAAU,IAAI;AAAA,MAC7B;AAAA,MACA,WAAW;AAAA,MACX;AAAA,IACJ;AACA,QAAI,cAAc,YAAY;AAC1B,aAAO;AAAA,IACX;AAAA,EACJ;AAKA,MAAI,YAAY;AAChB,MAAI,YAAY;AAGhB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,QAAI,aAAa,SAAS,QAAQ,YAAY,MAAM,CAAC,EAAE,SAAS,GAAG;AAC/D,kBAAY;AACZ;AAAA,IACJ;AACA,iBAAa,MAAM,CAAC,EAAE,SAAS;AAAA,EACnC;AAGA,MAAI,YAAY,KAAK,YAAY,MAAM,SAAS,GAAG;AAC/C,UAAM,WAAW,MAAM,YAAY,CAAC;AACpC,UAAM,cAAc,MAAM,SAAS;AACnC,UAAM,WAAW,MAAM,YAAY,CAAC;AAKpC,QACI,SAAS,KAAK,EAAE,WAAW,IAAI,KAC/B,SAAS,KAAK,EAAE,WAAW,IAAI,KAC/B,YAAY,SAAS,IAAI,KACzB,YAAY,SAAS,IAAI,GAC3B;AACE,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,SAAO;AACX;AAGA,SAAS,mBACL,OACA,YACA,SACA,gBACM;AACN,MAAI,CAAC,MAAM,YAAY,MAAM,SAAS,WAAW,GAAG;AAChD,WAAO;AAAA,EACX;AAEA,MAAI,iBAAiB;AACrB,MAAI,MAAM,OAAO,MAAM,IAAI,WAAW,GAAG;AACrC,UAAM,CAAC,SAAS,IAAI,MAAM;AAC1B,qBAAiB,mBAAmB,WAAW,YAAY,OAAO;AAAA,EACtE;AAEA,SAAO;AACX;AAEO,SAAS,kBAAuC,SAAiB;AACpE,MAAI,CAAC,KAAK,QAAQ,qBAAqB,CAAC,QAAQ,SAAS,IAAI,GAAG;AAC5D,SAAK,IAAI,WAAW,IAAI,CAAC,CAAC;AAC1B,WAAO;AAAA,EACX;AACA,QAAM,KAAK,IAAI,WAAW,EAAC,MAAM,KAAI,CAAC;AACtC,QAAM,kBAAkB;AAAA,IACpB,gBAAgB;AAAA,IAChB,MAAM;AAAA,EACV;AAEA,KAAG,IAAI,SAAS,eAAe;AAC/B,KAAG,IAAI,QAAQ,eAAe;AAC9B,KAAG,IAAI,UAAU,eAAe;AAEhC,QAAM,SAAS,GAAG,MAAM,SAAS,CAAC,CAAC;AAEnC,QAAM,QAAiC,CAAC;AAExC,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,aAAa,kBAAkB,KAAK;AAE1C,WAAS,kBACLC,SACA,iBAAiB,GACjB,aAA4B,MAC9B;AACE,eAAW,SAASA,SAAQ;AACxB,UAAI,wBAAwB;AAE5B,UAAI,MAAM,SAAS,WAAW,MAAM,SAAS,cAAc;AACvD,yBAAiB,OAAO,YAAY,OAAO,SAAS,KAAK;AAAA,MAC7D,WAAW,MAAM,SAAS,UAAU;AAChC,gCAAwB;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,MACJ,WAAW,MAAM,SAAS,eAAe;AAErC,YAAI,eAAe,SAAS;AACxB,kCAAwB;AAAA,YACpB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,MAAM,YAAY,MAAM,SAAS,SAAS,GAAG;AAC7C,0BAAkB,MAAM,UAAU,uBAAuB,MAAM,IAAI;AAAA,MACvE;AAAA,IACJ;AAAA,EACJ;AAEA,oBAAkB,MAAM;AAExB,OAAK,IAAI,WAAW,IAAI,KAAK;AAE7B,SAAO;AACX;;;AClYA,SAAQ,QAAQ,UAAU,QAAQC,iBAAe;AAEjD,SAAQ,0BAA0B,yBAAwB;AAiB1D,SAAS,6BAA6B,SAAiB,SAAiC;AACpF,QAAM,EAAC,MAAM,iBAAiB,QAAQ,KAAI,IAAI;AAC9C,QAAM,SAAwB,CAAC;AAC/B,QAAM,YAAY,IAAI,OAAO,SAAS,QAAQ,SAAS,KAAK;AAE5D,MAAI,cAAc;AAElB,SAAO,cAAc,QAAQ,QAAQ;AACjC,UAAM,YAAY,QAAQ,MAAM,WAAW;AAC3C,UAAM,QAAQ,UAAU,KAAK,SAAS;AAEtC,QAAI,CAAC,OAAO;AACR;AAAA,IACJ;AAEA,UAAM,SAAS,MAAM,CAAC,KAAK;AAC3B,UAAM,aAAa,cAAc,MAAM;AACvC,UAAM,eAAe,aAAa,MAAM,CAAC,EAAE;AAC3C,UAAM,eAAe,IAAI,OAAO,IAAI,MAAM,eAAe,GAAG;AAC5D,UAAM,aAAa,QAAQ,MAAM,YAAY;AAC7C,UAAM,aAAa,aAAa,KAAK,UAAU;AAE/C,QAAI,CAAC,YAAY;AACb,oBAAc;AACd;AAAA,IACJ;AAEA,UAAM,cAAc,WAAW,MAAM,GAAG,WAAW,KAAK;AAExD,QAAI;AAEJ,QAAI;AACA,aAAOC,UAAS,WAAW;AAAA,IAC/B,SAAS,OAAO;AACZ,aAAO,KAAK,4CAA4C,IAAI,KAAK,KAAK,EAAE;AACxE,oBAAc;AACd;AAAA,IACJ;AAEA,QAAI,CAAC,kBAAkB,IAAI,GAAG;AAC1B,oBAAc,eAAe,WAAW,QAAQ,WAAW,CAAC,EAAE;AAC9D;AAAA,IACJ;AAEA,UAAM,WAAW,yBAAyB,MAAM,MAAM,eAAe;AACrE,UAAM,YAAY,MAAM,QAAQ,SAAS,MAAM,KAAK,SAAS,OAAO,SAAS;AAE7E,UAAM,aAAa;AACnB,UAAM,WAAW,eAAe,WAAW,QAAQ,WAAW,CAAC,EAAE;AAEjE,QAAI,WAAW;AACX,YAAM,OAAO,SAAS,UAAU;AAAA,QAC5B,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,aAAa;AAAA,MACjB,CAAC;AAED,YAAM,eAAe,KAChB,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAC5B,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,IAAI,EAAE,EAChC,KAAK,IAAI;AAEd,aAAO,KAAK;AAAA,QACR,OAAO;AAAA,QACP,KAAK;AAAA,QACL,aAAa,GAAG,MAAM;AAAA,EAAyB,YAAY;AAAA,EAAK,MAAM;AAAA;AAAA,MAC1E,CAAC;AAAA,IACL,OAAO;AACH,aAAO,KAAK;AAAA,QACR,OAAO;AAAA,QACP,KAAK;AAAA,QACL,aAAa;AAAA,MACjB,CAAC;AAAA,IACL;AAEA,kBAAc;AAAA,EAClB;AAEA,WAAS,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK;AACzC,UAAM,EAAC,OAAO,KAAK,YAAW,IAAI,OAAO,CAAC;AAC1C,cAAU,QAAQ,MAAM,GAAG,KAAK,IAAI,cAAc,QAAQ,MAAM,GAAG;AAAA,EACvE;AAEA,SAAO;AACX;AAEO,SAAS,kBAAuC,SAAyB;AAC5E,QAAM,EAAC,kBAAkB,MAAK,IAAI,KAAK;AACvC,QAAM,OAAO,KAAK,QAAQ,CAAC;AAE3B,YAAU,6BAA6B,SAAS;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,EACf,CAAC;AAED,SAAO;AACX;;;AVlGO,IAAM,YAAN,MAAgB;AAAA,EASnB,YAAY,QAA4B,CAAC,GAAG;AACxC,SAAK,aAAa,MAAM,cAAc,OAAO;AAC7C,SAAK,OAAO,MAAM,QAAQ,OAAO;AACjC,SAAK,SAAS,MAAM,UAAU,OAAO;AACrC,SAAK,OAAO,MAAM,QAAQ,OAAO;AACjC,SAAK,WAAW,MAAM,YAAY,OAAO;AACzC,SAAK,WAAW,MAAM,YAAY,OAAO;AACzC,SAAK,YAAY,MAAM,aAAa,OAAO;AAAA,EAC/C;AACJ;AAqBA,eAAsB,OAA4B,SAAiB;AAC/D,YAAU,kBAAkB,KAAK,MAAM,OAAO;AAC9C,YAAU,mBAAmB,KAAK,MAAM,OAAO;AAC/C,YAAU,gBAAgB,KAAK,MAAM,OAAO;AAC5C,YAAU,kBAAkB,KAAK,MAAM,OAAO;AAC9C,YAAU,MAAM,oBAAoB,KAAK,MAAM,OAAO;AACtD,YAAU,kBAAkB,KAAK,MAAM,OAAO;AAC9C,YAAU,gBAAgB,KAAK,MAAM,OAAO;AAC5C,YAAU,oBAAoB,KAAK,MAAM,OAAO;AAChD,YAAU,cAAc,KAAK,MAAM,OAAO;AAC1C,YAAU,gBAAgB,KAAK,MAAM,OAAO;AAE5C,OAAK,IAAI,UAAU,IAAI,KAAK,UAAU,KAAK,CAAC;AAE5C,SAAO;AACX;AAEA,eAAe,oBAAyC,SAAiB;AACrE,MAAI,OAAO,CAAC;AAEZ,aAAW,WAAW,KAAK,UAAU;AACjC,QAAI,SAAS,MAAM,QAAQ,KAAK,MAAM,SAAS,CAAC,CAAC;AAEjD,QAAI,MAAM,QAAQ,MAAM,GAAG;AACvB,aAAO,MAAM,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;AAClC,eAAS,OAAO,CAAC;AAAA,IACrB;AAEA,QAAI,WAAW,QAAW;AACtB,gBAAU;AAAA,IACd;AAAA,EACJ;AAEA,SAAO;AACX;;;ADzCA,SAAS,KAAK,MAAsB,MAAuB;AACvD,SAAO,GAAG,IAAI,GAAG,OAAO,MAAM,OAAO,EAAE;AAC3C;AAEA,IAAM,aAAa,CAAC,GAAgB,MAAmB,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC;AA7DnF;AA+DA,+BAAC,YA+CG,aAAC,UAKD,aAAC,UA2CD,aAAC,UA+DD,gBAAC;AA7JE,IAAM,kBAAN,MAAsB;AAAA,EAyCzB,YAAY,KAAU,UAAmB,EAAC,MAAM,SAAS,iBAAiB,MAAK,GAAG;AAzC/E;AACH,SAAS,OAAO;AAkBhB,SAAQ,MAAR;AAEA,SAAQ,YAAuB,CAAC;AAEhC,SAAQ,WAAqB,CAAC;AAE9B,SAAQ,aAAa,IAAI,QAAc;AAEvC,SAAQ,iBAAiB,IAAI,QAAoB;AAEjD,SAAQ,aAAa,IAAI,QAAuB;AAEhD,SAAQ,eAAe,IAAI,QAAqB;AAEhD,SAAQ,iBAAiB,IAAI,QAAuB;AAEpD,SAAQ,kBAAkB,IAAI,QAAyC;AAEvE,SAAQ,QAAwC,CAAC;AAEjD,SAAQ,UAAR;AAGI,SAAK,MAAM;AACX,SAAK,UAAU;AAAA,EACnB;AAAA,EAzCA,IAAI,SAAS;AACT,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA,EAEA,IAAI,UAAU;AACV,WAAO,KAAK,SAAS,MAAM;AAAA,EAC/B;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,KAAK,UAAU,MAAM;AAAA,EAChC;AAAA,EAEA,IAAI,SAAS;AACT,WAAO,KAAK,IAAI;AAAA,EACpB;AAAA,EA6BS,MAAM,OAAO;AAClB,SAAK,YAAY,MAAM,SAAS,IAAI,EAAE,SAAS,QAAQ,KAAK,SAAS;AACrE,SAAK,WAAW,MAAM,SAAS,IAAI,EAAE,QAAQ,QAAQ,KAAK,QAAQ;AAAA,EACtE;AAAA,EAES,MAAM,KAAK,MAAoB,MAAuB;AAC3D,UAAM,OAAOC,eAAc,IAAI;AAC/B,UAAM,MAAM,KAAK,MAAM,IAAI;AAE3B,QAAI,OAAO,KAAK,OAAO;AACnB,aAAO,KAAK,MAAM,GAAG;AAAA,IACzB;AAEA,UAAM,QAAQ,IAAI,MAAM;AAExB,SAAK,MAAM,GAAG,IAAI,MAAM;AAExB,QAAI;AACA,YAAM,SAASA,eAAcC,MAAK,KAAK,IAAI,OAAO,IAAI,CAAC;AACvD,YAAM,MAAM,MAAM,KAAK,IAAI,KAAK,MAAM;AACtC,YAAM,OAAO,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI;AAEzC,YAAM,UAAU,KAAK,cAAc,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC;AACnE,YAAM,UAAU,MAAM,OAAO,KAAK,SAAS,GAAG;AAI9C,YAAM,OAAO,QAAQ,IAAI,KAAK,IAAI;AAElC,YAAM,SAAS,IAAI,EAAE,OAAO,QAAQ,KAAK,MAAM,IAAI;AAEnD,WAAK,IAAI,KAAK,YAAY,MAAM,KAAK,UAAU;AAC/C,WAAK,IAAI,KAAK,cAAc,MAAM,KAAK,QAAQ;AAC/C,WAAK,IAAI,KAAK,IAAI,MAAM,MAAM,IAAI;AAElC,WAAK,MAAM,GAAG,IAAI;AAClB,YAAM,QAAQ,OAAO;AAIrB,YAAM,SAAS,IAAI,EAAE,SAAS,QAAQ,SAAS,IAAI;AAAA,IACvD,SAAS,OAAO;AACZ,YAAM,OAAO,KAAK;AAAA,IACtB;AAEA,WAAO,MAAM;AAAA,EACjB;AAAA,EAES,MAAM,KAAK,MAAsB,UAAmB;AACzD,UAAM,QAAQ,IAAI,MAAyB,MAAM,YAAa,MAAM,KAAK,KAAK,IAAI,CAAE;AAEpF,UAAM,OAAO,EAAC,OAAO,IAAI,UAAU,CAAC,EAAC;AAErC,UAAM,SAAS,IAAI,EAAE,KAAK,QAAQ,KAAK;AAEvC,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,KAAK,MAAoB;AAC3B,WAAO,KAAK,MAAMD,eAAc,IAAI,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,KAAK,MAAoB;AAC3B,WAAO,KAAK,MAAMA,eAAc,IAAI,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,MAAM,MAAoB;AAC5B,WAAO,KAAK,OAAOA,eAAc,IAAI,CAAC;AAAA,EAC1C;AAAA,EAEA,MAAM,UAAU,MAAoB;AAChC,WAAO,KAAK,WAAWA,eAAc,IAAI,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,OAAO,MAAoB;AAC7B,WAAO,KAAK,QAAQA,eAAc,IAAI,CAAC;AAAA,EAC3C;AAAA,EAEA,MAAM,SAAS,MAAoB;AAC/B,WAAO,KAAK,UAAUA,eAAc,IAAI,CAAC;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAO,MAAoB;AAC7B,UAAM,OAAOA,eAAc,IAAI;AAE/B,UAAM,SAAuB,CAAC;AAE9B,QAAI;AACA,YAAM,WAAW,MAAM,KAAK,SAAS,IAAI;AACzC,YAAM,WAAW,SAAS,IAAI,CAAC,EAAC,QAAO,MAAM,OAAO;AAEpD,iBAAW,WAAW,UAAU;AAC5B,cAAM,EAAC,OAAO,OAAO,QAAO,IAAI,aAAa,OAAO;AAEpD,YAAI,UAAU,KAAK,CAAC,OAAO,GAAG,GAAG;AAC7B,iBAAO,GAAG,IAAI;AAAA,QAClB;AAEA,mBAAW,UAAU,SAAS;AAC1B,iBAAO,MAAM,IAAI;AAAA,QACrB;AAAA,MACJ;AAAA,IACJ,QAAQ;AAAA,IAIR;AAEA,WAAO;AAAA,EACX;AAAA,EAES,MAAM,QAAQ,MAAoB,KAAa,MAAY;AAChE,UAAM,OAAOA,eAAc,IAAI;AAC/B,UAAM,MAAM,IAAI,UAAU;AAC1B,UAAM,UAAU,KAAK,cAAc,MAAM,KAAK,MAAM,GAAG;AACvD,UAAM,UAAU,MAAM,OAAO,KAAK,SAAS,GAAG;AAE9C,UAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,UAAM,SAAS,CAAC,GAAG,IAAI,OAAO,IAAI,CAAC;AAEnC,WAAO,EAAC,SAAS,MAAM,OAAM;AAAA,EACjC;AAAA,EAEA,MAAM,MAAoB,MAAsB;AAC5C,UAAM,OAAOA,eAAc,IAAI;AAC/B,UAAM,YAAY,KAAK,gBAAgB,IAAI,IAAI;AAE/C,QAAI,CAAC,WAAW;AACZ,aAAO;AAAA,IACX;AAEA,WAAO,OAAO,UAAU,IAAI,CAAC,KAAK;AAAA,EACtC;AAAA,EAEA,QAAQ,MAAsB,MAAuB;AACjD,UAAM,MAAM,KAAK,MAAM,IAAI;AAE3B,WAAO,KAAK,MAAM,GAAG;AACrB,SAAK,WAAW,OAAO,GAAG;AAC1B,SAAK,WAAW,OAAO,GAAG;AAC1B,SAAK,aAAa,OAAO,GAAG;AAC5B,SAAK,eAAe,OAAO,GAAG;AAC9B,SAAK,eAAe,OAAO,GAAG;AAC9B,SAAK,gBAAgB,OAAO,GAAG;AAAA,EACnC;AAAA,EAEA,MAAc,MAAM,MAAsB,MAAuB;AAC7D,UAAM,MAAM,KAAK,MAAM,IAAI;AAE3B,UAAM,KAAK,KAAK,MAAM,IAAI;AAE1B,WAAO,KAAK,WAAW,IAAI,GAAG;AAAA,EAClC;AAAA,EAEA,MAAc,MAAM,MAAsB,MAA+C;AACrF,UAAM,MAAM,KAAK,MAAM,IAAI;AAE3B,UAAM,KAAK,KAAK,MAAM,IAAI;AAE1B,UAAM,OAAO,KAAK,WAAW,IAAI,GAAG,KAAK,CAAC;AAC1C,UAAM,YAA6B,MAAM;AAAA,OACpC,KAAK,WAAW,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,EAAC,KAAI,MAAM;AACnD,eAAO,KAAK,MAAM,MAAM,QAAQ,IAAI;AAAA,MACxC,CAAC;AAAA,IACL;AAEA,WAAO,KAAK,OAAO,GAAG,SAAS;AAAA,EACnC;AAAA,EAEA,MAAc,OAAO,MAAsB,MAA4C;AACnF,UAAM,MAAM,KAAK,MAAM,IAAI;AAE3B,UAAM,UAAU,MAAM,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAM,SAAS,KAAK,aAAa,IAAI,GAAG,KAAK,CAAC;AAC9C,UAAM,OAAO,MAAM;AAAA,OACd,KAAK,WAAW,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,QAAQ;AAChD,eAAO;AAAA,UACH,GAAG;AAAA,UACH,GAAI,MAAM,KAAK,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,QAChD;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,WAAO,EAAC,MAAM,SAAS,MAAM,OAAM;AAAA,EACvC;AAAA,EAEA,MAAc,WACV,MACA,MACyB;AACzB,UAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,UAAM,QAAQ,IAAI,MAAiB;AAEnC,UAAM,QAAQ,MAAM,EAAC,MAAM,QAAO,CAAC;AAEnC,UAAM,KAAK,KAAK,MAAM,IAAI;AAC1B,UAAM;AAAA,OACD,KAAK,WAAW,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,QAAQ;AAChD,cAAM,QAAQ,MAAM,KAAK,WAAW,IAAI,MAAM,QAAQ,IAAI,CAAC;AAC3D,cAAM,YAAY,IAAI,MAAM,EAAC,MAAM,SAAQ,CAAC;AAC5C,cAAM,cAAc,MAAM,IAAI,IAAI;AAAA,MACtC,CAAC;AAAA,IACL;AAEA,KAAC,KAAK,aAAa,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,UAAU;AACpD,UAAI,CAAC,SAAS,OAAO,EAAE,SAAS,MAAM,IAAI,GAAG;AACzC,cAAM,QAAQ,MAAM,IAAI;AACxB,cAAM,YAAY,MAAM,MAAM,EAAC,MAAM,WAAU,CAAC;AAChD,cAAM,cAAc,MAAM,MAAM,IAAI;AAAA,MACxC;AAEA,UAAI,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI,KAAK,MAAM,WAAW;AAClD,cAAM,QAAQ,MAAM,IAAI;AACxB,cAAM,YAAY,MAAM,MAAM,EAAC,MAAM,SAAQ,CAAC;AAC9C,cAAM,cAAc,MAAM,MAAM,IAAI;AAAA,MACxC;AAAA,IACJ,CAAC;AAED,UAAM,OAAO,KAAK,IAAI,KAAK,IAAI,IAAI;AACnC,UAAM,YAAa,CAAC,EAAe,OAAO,KAAK,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;AAC7E,eAAW,YAAY,WAAW;AAC9B,YAAM,OAAOA,eAAcC,MAAKC,SAAQ,IAAI,GAAG,QAAQ,CAAC;AACxD,YAAM,QAAQ,IAAI;AAClB,YAAM,YAAY,MAAM,EAAC,MAAM,WAAU,CAAC;AAC1C,YAAM,cAAc,MAAM,IAAI;AAAA,IAClC;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,QAAQ,MAAsB,MAAuB;AAC/D,UAAM,MAAM,KAAK,MAAM,IAAI;AAE3B,UAAM,KAAK,KAAK,MAAM,IAAI;AAE1B,UAAM,SAAS,KAAK,aAAa,IAAI,GAAG,KAAK,CAAC;AAC9C,UAAM,YAA2B,MAAM;AAAA,OAClC,KAAK,WAAW,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,EAAC,KAAI,MAAM;AACnD,eAAO,KAAK,QAAQ,MAAM,QAAQ,IAAI;AAAA,MAC1C,CAAC;AAAA,IACL;AAEA,WAAO,OAAO,OAAO,GAAG,SAAS;AAAA,EACrC;AAAA,EAEA,MAAc,UAAU,MAAsB,MAAuB;AACjE,UAAM,MAAM,KAAK,MAAM,IAAI;AAE3B,UAAM,KAAK,KAAK,MAAM,IAAI;AAE1B,UAAM,WAAW,KAAK,eAAe,IAAI,GAAG,KAAK,CAAC;AAClD,UAAM,YAA6B,MAAM;AAAA,OACpC,KAAK,WAAW,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,EAAC,MAAM,SAAQ,MAAM;AAC7D,cAAMC,YAAW,MAAM,KAAK,UAAU,MAAM,QAAQ,IAAI;AACxD,eAAOA,UAAS,IAAI,CAAC,aAAa,EAAC,GAAG,SAAS,SAAQ,EAAE;AAAA,MAC7D,CAAC;AAAA,IACL;AAEA,WAAO,SAAS,OAAO,GAAG,SAAS,EAAE,KAAK,UAAU;AAAA,EACxD;AAAA,EAEQ,MAAM,KAAa;AACvB,WAAO;AAAA,MACH,MAAM,KAAK,WAAW,KAAK,GAAG;AAAA,MAC9B,QAAQ,KAAK,aAAa,KAAK,GAAG;AAAA,MAClC,MAAM,KAAK,WAAW,KAAK,GAAG;AAAA,MAC9B,UAAU,KAAK,eAAe,KAAK,GAAG;AAAA,MACtC,UAAU,KAAK,eAAe,KAAK,GAAG;AAAA,MACtC,WAAW,KAAK,gBAAgB,KAAK,GAAG;AAAA,IAC5C;AAAA,EACJ;AAAA,EAEQ,cACJ,MACA,KACA,MACA,KACa;AACb,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,UAAU,CAACC,UAAuB;AAC9B,eAAO,KAAK,IAAI,KAAKH,MAAK,KAAK,IAAI,OAAOG,KAAI,CAAC;AAAA,MACnD;AAAA,MACA,UAAU,OAAO,MAAsB,YAAoB;AACvD,cAAM,WAAW,SAAS,MAAM,IAAI;AACpC,cAAM,KAAK,IAAI,MAAMH,MAAK,KAAK,IAAI,OAAO,QAAQ,GAAG,SAAS,IAAI;AAAA,MACtE;AAAA,MACA,UAAU,CAACG,UAAuBH,MAAK,KAAK,IAAI,OAAOG,KAAI;AAAA,MAC3D,OAAO,KAAK,IAAI;AAAA,MAChB,KAAK,IAAI,UAAU,GAAG;AAAA,MACtB,UAAU,KAAK;AAAA,MACf,WAAW,IAAI,UAAU,GAAG;AAAA,MAC5B,UAAU;AAAA,QACN,eAAe,KAAK,OAAO,SAAS,SAAS;AAAA,QAC7C,YACI,OAAO,KAAK,OAAO,SAAS,SAAS,eAAe,WAC7C,KAAK,OAAO,SAAS,SAAS,aAC/B,QAAQ,KAAK,OAAO,SAAS,SAAS,UAAU;AAAA,QAC1D,kBAAkB,KAAK,OAAO,SAAS,OAAO;AAAA,QAC9C,YAAY,KAAK,OAAO,SAAS;AAAA,QACjC,kBAAkB,KAAK,OAAO,SAAS;AAAA,QACvC,2BAA2B,KAAK,QAAQ,SAAS;AAAA,MACrD;AAAA,MACA,SAAS;AAAA,QACL,eAAe,CAAC,KAAK,OAAO,SAAS;AAAA,QACrC,mBAAmB,KAAK,OAAO,YAAY,YAAY;AAAA,QACvD,iBAAiB,KAAK,QAAQ;AAAA,MAClC;AAAA,MACA,MAAM,KAAK,QAAQ;AAAA,IACvB;AAAA,EACJ;AACJ;AAvWO;AA8CM,4BAAM,QAAf,WA9CS;AAmDA,4BAAM,QAAf,WAnDS;AA8FA,4BAAM,QAAf,WA9FS;AA6JA,4BAAM,WAAf,cA7JS;AAAA,kBAAN,+CADP,6BACa;AAAN,4BAAM;",
|
|
4
|
+
"sourcesContent": ["import type {VFile} from '~/core/utils';\nimport type {Collect, Plugin} from './types';\nimport type {Meta} from '~/core/meta';\n\nimport {AsyncSeriesHook, AsyncSeriesWaterfallHook} from 'tapable';\n\nimport {generateHooksAccess} from '~/core/utils';\n\nexport function hooks(name: string) {\n return {\n Collects: new AsyncSeriesWaterfallHook<[Collect[]]>(['collects'], `${name}.Collects`),\n Plugins: new AsyncSeriesWaterfallHook<[Plugin[]]>(['plugins'], `${name}.Plugins`),\n Loaded: new AsyncSeriesHook<[string, DeepFrozen<Meta>, NormalizedPath]>(\n ['markdown', 'meta', 'path'],\n `${name}.Loaded`,\n ),\n Resolved: new AsyncSeriesHook<[string, NormalizedPath]>(\n ['markdown', 'path'],\n `${name}.Resolved`,\n ),\n Dump: new AsyncSeriesHook<VFile<string>>(['vfile'], `${name}.Dump`),\n };\n}\n\nconst [getHooks, withHooks] = generateHooksAccess('Markdown', hooks);\n\nexport {getHooks, withHooks};\n", "import type {Run as BaseRun} from '~/core/run';\nimport type {VarsService} from '~/core/vars';\nimport type {Meta, MetaService} from '~/core/meta';\nimport type {LoaderContext, TransformMode} from './loader';\nimport type {\n AssetInfo,\n Collect,\n EntryGraph,\n EntryInfo,\n GraphInfo,\n HeadingInfo,\n IncludeInfo,\n Location,\n Plugin,\n} from './types';\n\nimport {dirname, join} from 'node:path';\nimport {SourceMap} from '@diplodoc/liquid';\n\nimport {Buckets, Defer, Graph, VFile, all, bounded, fullPath, normalizePath} from '~/core/utils';\n\nimport {LoaderAPI, loader} from './loader';\nimport {getHooks, withHooks} from './hooks';\nimport {parseHeading} from './utils';\n\ntype MarkdownServiceConfig = {\n outputFormat: `${TransformMode}`;\n template: {\n enabled: boolean;\n keepNotVar: boolean;\n legacyConditions: boolean;\n features: {\n substitutions: boolean;\n conditions?: boolean | 'strict';\n };\n scopes: {\n code: boolean;\n };\n };\n preprocess?: {\n mergeSvg?: boolean;\n mergeIncludes?: boolean;\n hashIncludes?: boolean;\n mergeAutotitles?: boolean;\n };\n};\n\ntype Run = BaseRun<MarkdownServiceConfig> & {\n meta: MetaService;\n vars: VarsService;\n};\n\ntype Options = {\n mode: 'build' | 'translate';\n skipMissingVars: boolean;\n};\n\ninterface CacheItem {\n content: string;\n varsMetadata?: Hash;\n varsSystem?: Hash;\n meta: Meta;\n}\n\nfunction hash(path: NormalizedPath, from?: NormalizedPath) {\n return `${path}${from ? '+' + from : ''}`;\n}\n\nconst byLocation = (a: HeadingInfo, b: HeadingInfo) => a.location[0] - b.location[0];\n\n@withHooks\nexport class MarkdownService {\n readonly name = 'Markdown';\n\n get logger() {\n return this.run.logger;\n }\n\n get plugins() {\n return this._plugins.slice();\n }\n\n get collects() {\n return this._collects.slice();\n }\n\n get config() {\n return this.run.config;\n }\n\n private run: Run;\n\n private _collects: Collect[] = [];\n\n private _plugins: Plugin[] = [];\n\n private pathToMeta = new Buckets<Meta>();\n\n private pathToComments = new Buckets<Location[]>();\n\n private pathToDeps = new Buckets<IncludeInfo[]>();\n\n private pathToAssets = new Buckets<AssetInfo[]>();\n\n private pathToHeadings = new Buckets<HeadingInfo[]>();\n\n private pathToSourcemap = new Buckets<Record<number | string, string>>();\n\n private cache: Hash<Promise<CacheItem> | CacheItem> = {};\n\n private options;\n\n constructor(run: Run, options: Options = {mode: 'build', skipMissingVars: false}) {\n this.run = run;\n this.options = options;\n }\n\n @bounded async init() {\n this._collects = await getHooks(this).Collects.promise(this._collects);\n this._plugins = await getHooks(this).Plugins.promise(this._plugins);\n }\n\n @bounded async load(path: RelativePath, from?: NormalizedPath) {\n const file = normalizePath(path);\n const key = hash(file, from);\n\n if (key in this.cache) {\n const {content, varsMetadata, varsSystem, meta} = await this.cache[key];\n this.run.meta.addMetadata(file, varsMetadata);\n this.run.meta.addSystemVars(file, varsSystem);\n this.run.meta.add(file, meta, true);\n return content;\n }\n\n const defer = new Defer();\n\n this.cache[key] = defer.promise;\n\n try {\n const source = normalizePath(join(this.run.input, file)) as AbsolutePath;\n const raw = await this.run.read(source);\n const vars = this.run.vars.for(file, from);\n\n const context = this.loaderContext(file, raw, vars, this.proxy(key));\n const content = await loader.call(context, raw);\n\n // At this point all internal states are fully resolved.\n // So we don't expect Defer here.\n const meta = context.api.meta.get() as Meta;\n\n await getHooks(this).Loaded.promise(raw, meta, file);\n\n this.run.meta.addMetadata(file, vars.__metadata);\n this.run.meta.addSystemVars(file, vars.__system);\n this.run.meta.add(file, meta, true);\n\n const result = {\n content,\n varsMetadata: vars.__metadata,\n varsSystem: vars.__system,\n meta,\n };\n this.cache[key] = result;\n defer.resolve(result);\n\n // TODO: this may trigger uncaught exceptions\n // But if we move this two lines above, then program exits unexpectedly\n await getHooks(this).Resolved.promise(content, file);\n } catch (error) {\n defer.reject(error);\n }\n\n return (await defer.promise).content;\n }\n\n @bounded async dump(file: NormalizedPath, markdown?: string) {\n const vfile = new VFile<string, EntryInfo>(file, markdown || (await this.load(file)));\n\n vfile.info = {title: '', headings: []};\n\n await getHooks(this).Dump.promise(vfile);\n\n return vfile;\n }\n\n async meta(path: RelativePath) {\n return this._meta(normalizePath(path));\n }\n\n async deps(path: RelativePath) {\n return this._deps(normalizePath(path));\n }\n\n async graph(path: RelativePath) {\n return this._graph(normalizePath(path));\n }\n\n async relations(path: RelativePath) {\n return this._relations(normalizePath(path));\n }\n\n async assets(path: RelativePath) {\n return this._assets(normalizePath(path));\n }\n\n async headings(path: RelativePath) {\n return this._headings(normalizePath(path));\n }\n\n async titles(path: RelativePath) {\n const file = normalizePath(path);\n\n const titles: Hash<string> = {};\n\n try {\n const headings = await this.headings(file);\n const contents = headings.map(({content}) => content);\n\n for (const content of contents) {\n const {level, title, anchors} = parseHeading(content);\n\n if (level === 1 && !titles['#']) {\n titles['#'] = title;\n }\n\n for (const anchor of anchors) {\n titles[anchor] = title;\n }\n }\n } catch {\n // This is acceptable.\n // If this is a real file and someone depends on his titles,\n // then we throw exception in md plugin.\n }\n\n return titles;\n }\n\n @bounded async inspect(path: RelativePath, raw: string, vars: Hash) {\n const file = normalizePath(path);\n const api = new LoaderAPI();\n const context = this.loaderContext(file, raw, vars, api);\n const content = await loader.call(context, raw);\n\n const deps = api.deps.get();\n const assets = [...api.assets.get()];\n\n return {content, deps, assets};\n }\n\n remap(path: RelativePath, line: number): number {\n const file = normalizePath(path);\n const sourcemap = this.pathToSourcemap.get(file);\n\n if (!sourcemap) {\n return line;\n }\n\n return Number(sourcemap[line]) || line;\n }\n\n release(path: NormalizedPath, from?: NormalizedPath) {\n const key = hash(path, from);\n\n delete this.cache[key];\n this.pathToDeps.delete(key);\n this.pathToMeta.delete(key);\n this.pathToAssets.delete(key);\n this.pathToHeadings.delete(key);\n this.pathToComments.delete(key);\n this.pathToSourcemap.delete(key);\n }\n\n private async _meta(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n return this.pathToMeta.get(key);\n }\n\n private async _deps(file: NormalizedPath, from?: NormalizedPath): Promise<IncludeInfo[]> {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const deps = this.pathToDeps.get(key) || [];\n const internals: IncludeInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path}) => {\n return this._deps(path, from || file);\n }),\n );\n\n return deps.concat(...internals);\n }\n\n private async _graph(path: NormalizedPath, from?: NormalizedPath): Promise<EntryGraph> {\n const key = hash(path, from);\n\n const content = await this.load(path, from);\n const assets = this.pathToAssets.get(key) || [];\n const deps = await all(\n (this.pathToDeps.get(key) || []).map(async (dep) => {\n return {\n ...dep,\n ...(await this._graph(dep.path, from || path)),\n };\n }),\n );\n\n return {path, content, deps, assets};\n }\n\n private async _relations(\n path: NormalizedPath,\n from?: NormalizedPath,\n ): Promise<Graph<GraphInfo>> {\n const key = hash(path, from);\n const graph = new Graph<GraphInfo>();\n\n graph.addNode(path, {type: 'entry'});\n\n await this.load(path, from);\n await all(\n (this.pathToDeps.get(key) || []).map(async (dep) => {\n graph.consume(await this._relations(dep.path, from || path));\n graph.setNodeData(dep.path, {type: 'source'});\n graph.addDependency(path, dep.path);\n }),\n );\n\n (this.pathToAssets.get(key) || []).map(async (asset) => {\n if (['image', 'video'].includes(asset.type)) {\n graph.addNode(asset.path);\n graph.setNodeData(asset.path, {type: 'resource'});\n graph.addDependency(path, asset.path);\n }\n\n if (['link'].includes(asset.type) && asset.autotitle) {\n graph.addNode(asset.path);\n graph.setNodeData(asset.path, {type: 'source'});\n graph.addDependency(path, asset.path);\n }\n });\n\n const meta = this.run.meta.get(path);\n const resources = ([] as string[]).concat(meta.script || [], meta.style || []);\n for (const resource of resources) {\n const file = normalizePath(join(dirname(path), resource));\n graph.addNode(file);\n graph.setNodeData(file, {type: 'resource'});\n graph.addDependency(path, file);\n }\n\n return graph;\n }\n\n private async _assets(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const assets = this.pathToAssets.get(key) || [];\n const internals: AssetInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path}) => {\n return this._assets(path, from || file);\n }),\n );\n\n return assets.concat(...internals);\n }\n\n private async _headings(file: NormalizedPath, from?: NormalizedPath) {\n const key = hash(file, from);\n\n await this.load(file, from);\n\n const headings = this.pathToHeadings.get(key) || [];\n const internals: HeadingInfo[][] = await all(\n (this.pathToDeps.get(key) || []).map(async ({path, location}) => {\n const headings = await this._headings(path, from || file);\n return headings.map((heading) => ({...heading, location}));\n }),\n );\n\n return headings.concat(...internals).sort(byLocation);\n }\n\n private proxy(key: string) {\n return {\n deps: this.pathToDeps.bind(key),\n assets: this.pathToAssets.bind(key),\n meta: this.pathToMeta.bind(key),\n comments: this.pathToComments.bind(key),\n headings: this.pathToHeadings.bind(key),\n sourcemap: this.pathToSourcemap.bind(key),\n };\n }\n\n private loaderContext(\n path: NormalizedPath,\n raw: string,\n vars: Hash,\n api?: Partial<LoaderAPI>,\n ): LoaderContext {\n return {\n path,\n vars,\n logger: this.logger,\n readFile: (path: RelativePath) => {\n return this.run.read(join(this.run.input, path));\n },\n emitFile: async (file: NormalizedPath, content: string) => {\n const rootPath = fullPath(file, path);\n await this.run.write(join(this.run.input, rootPath), content, true);\n },\n fullPath: (path: RelativePath) => join(this.run.input, path),\n input: this.run.input,\n api: new LoaderAPI(api),\n collects: this.collects,\n sourcemap: new SourceMap(raw),\n settings: {\n substitutions: this.config.template.features.substitutions,\n conditions:\n typeof this.config.template.features.conditions === 'string'\n ? (this.config.template.features.conditions as 'strict')\n : Boolean(this.config.template.features.conditions),\n conditionsInCode: this.config.template.scopes.code,\n keepNotVar: this.config.template.keepNotVar,\n legacyConditions: this.config.template.legacyConditions,\n keepConditionSyntaxOnTrue: this.options.mode === 'translate',\n },\n options: {\n disableLiquid: !this.config.template.enabled,\n mergeContentParts: this.config.preprocess?.mergeSvg ?? false,\n skipMissingVars: this.options.skipMissingVars,\n },\n mode: this.options.mode,\n };\n }\n}\n", "import type {LiquidContext, SourceMap} from '@diplodoc/liquid';\nimport type {Meta} from '~/core/meta';\nimport type {Logger} from '~/core/logger';\nimport type {Bucket} from '~/core/utils';\nimport type {AssetInfo, Collect, HeadingInfo, IncludeInfo, Location} from './types';\n\nimport {merge} from 'lodash';\n\nimport {bucket} from '~/core/utils';\n\nimport {mangleFrontMatter} from './loader/mangle-frontmatter';\nimport {templateContent} from './loader/template-content';\nimport {resolveComments} from './loader/resolve-comments';\nimport {resolveDependencies} from './loader/resolve-deps';\nimport {resolveAssets} from './loader/resolve-assets';\nimport {resolveHeadings} from './loader/resolve-headings';\nimport {resolveNoTranslate} from './loader/resolve-no-translate';\nimport {resolveBlockCodes} from './loader/resolve-code';\nimport {resolveConditions} from './loader/resolve-conditions';\n\nexport enum TransformMode {\n Html = 'html',\n Md = 'md',\n}\n\nexport class LoaderAPI {\n blockCodes: Bucket<Location[]>;\n comments: Bucket<Location[]>;\n deps: Bucket<IncludeInfo[]>;\n assets: Bucket<AssetInfo[]>;\n meta: Bucket<Meta>;\n headings: Bucket<HeadingInfo[]>;\n sourcemap: Bucket<Record<number | string, string>>;\n\n constructor(proxy: Partial<LoaderAPI> = {}) {\n this.blockCodes = proxy.blockCodes || bucket();\n this.deps = proxy.deps || bucket();\n this.assets = proxy.assets || bucket();\n this.meta = proxy.meta || bucket();\n this.comments = proxy.comments || bucket();\n this.headings = proxy.headings || bucket();\n this.sourcemap = proxy.sourcemap || bucket();\n }\n}\n\nexport type LoaderContext = LiquidContext & {\n path: NormalizedPath;\n vars: Hash;\n logger: Logger;\n emitFile(path: NormalizedPath, content: string): Promise<void>;\n readFile(path: NormalizedPath): Promise<string>;\n fullPath(path: RelativePath): AbsolutePath;\n input: AbsolutePath;\n collects: Collect[];\n api: LoaderAPI;\n sourcemap: SourceMap;\n options: {\n disableLiquid: boolean;\n mergeContentParts: boolean;\n skipMissingVars?: boolean;\n };\n mode: 'build' | 'translate';\n};\n\nexport async function loader(this: LoaderContext, content: string) {\n content = mangleFrontMatter.call(this, content);\n content = resolveNoTranslate.call(this, content);\n content = templateContent.call(this, content);\n content = resolveConditions.call(this, content);\n content = await applyCollectPlugins.call(this, content);\n content = resolveBlockCodes.call(this, content);\n content = resolveComments.call(this, content);\n content = resolveDependencies.call(this, content);\n content = resolveAssets.call(this, content);\n content = resolveHeadings.call(this, content);\n\n this.api.sourcemap.set(this.sourcemap.dump());\n\n return content;\n}\n\nasync function applyCollectPlugins(this: LoaderContext, content: string) {\n let meta = {};\n\n for (const collect of this.collects) {\n let result = await collect.call(this, content, {});\n\n if (Array.isArray(result)) {\n meta = merge(meta, result[1] || {});\n result = result[0] as string;\n }\n\n if (result !== undefined) {\n content = result as string;\n }\n }\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nimport {extractFrontMatter, liquidJson} from '@diplodoc/liquid';\n\ntype YamlErrorMark = {\n line?: number;\n};\n\ntype YamlError = {\n reason?: string;\n mark?: YamlErrorMark;\n};\n\nfunction safeExtractFrontmatter(this: LoaderContext, content: string) {\n try {\n return extractFrontMatter(content);\n } catch (error) {\n const err = error as YamlError;\n if (err.reason === 'duplicated mapping key') {\n const line = typeof err.mark?.line === 'number' ? err.mark.line + 1 : undefined;\n const key = line === undefined ? '' : content.split('\\n')[line]?.trim().split(':')[0];\n\n if (key && key !== 'vcsPath') {\n const context = `[Reason: \"${err.reason}\"; Line: ${line}; Key: \"${key}\"]`;\n const errorMessage = `${this.path}: ${line}: YFM017 / invalid front matter format ${context}`;\n\n this.logger.error(errorMessage);\n }\n }\n return extractFrontMatter(content, {json: true});\n }\n}\n\nexport function mangleFrontMatter(this: LoaderContext, rawContent: string) {\n const {vars, options} = this;\n const {disableLiquid} = options;\n\n const [frontmatter, content, rawFrontmatter] = safeExtractFrontmatter.call(this, rawContent);\n\n if (!rawFrontmatter) {\n this.api.meta.set({});\n return rawContent;\n }\n\n if (disableLiquid) {\n this.api.meta.set(frontmatter);\n } else {\n this.api.meta.set(liquidJson.call(this, frontmatter, vars));\n }\n\n this.sourcemap.delete(1, rawFrontmatter);\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nimport {liquidDocument, liquidSnippet} from '@diplodoc/liquid';\n\nexport function templateContent(this: LoaderContext, rawContent: string) {\n const {vars, options} = this;\n const {disableLiquid} = options;\n\n if (disableLiquid) {\n return rawContent;\n }\n\n let content;\n\n if (this.mode === 'translate') {\n content = liquidDocument.call(this, rawContent, vars);\n } else {\n content = liquidSnippet.call(this, rawContent, vars, this.sourcemap);\n }\n\n return content;\n}\n", "import type {LoaderContext} from '../loader';\n\nexport function resolveComments(this: LoaderContext, content: string) {\n const COMMENTS_CONTENTS = /<!-{2,}[\\s\\S]*?-{2,}>/g;\n const comments = [];\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = COMMENTS_CONTENTS.exec(content))) {\n comments.push([match.index, COMMENTS_CONTENTS.lastIndex] as [number, number]);\n }\n\n this.api.comments.set(comments);\n\n return content;\n}\n", "import type {IncludeInfo} from '../types';\nimport type {LoaderContext} from '../loader';\n\nimport {dirname, join} from 'node:path';\n\nimport {normalizePath, parseLocalUrl, rebasePath} from '~/core/utils';\n\nimport {filterRanges, findLink} from '../utils';\n\nexport function resolveDependencies(this: LoaderContext, content: string) {\n const includes = [];\n const exclude = [...this.api.comments.get()];\n\n // Include example: {% include [createfolder](create-folder.md) %}\n // Regexp result: [createfolder](create-folder.md)\n const INCLUDE_CONTENTS = /{%\\s*include\\s*.+?%}/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = INCLUDE_CONTENTS.exec(content))) {\n // Ugly workaround for include examples\n // TODO: rewrite all inspect code on markdown-it parsing with minimal set of plugins\n if (content[match.index - 1] === '`') {\n continue;\n }\n\n const link = findLink(match[0]) as string;\n // TODO: warn about non local urls\n const include = parseLocalUrl<IncludeInfo>(link);\n\n if (include && include.path) {\n const currentPath = this.path;\n const normalizedIncludePath = normalizePath(join(dirname(currentPath), include.path));\n\n if (normalizedIncludePath === currentPath) {\n this.logger.error('YFM016', `${currentPath}: The file is included in itself`);\n\n continue;\n }\n\n include.path = rebasePath(currentPath, include.path as RelativePath);\n include.link = link;\n include.match = content.slice(match.index, INCLUDE_CONTENTS.lastIndex);\n include.location = [match.index, INCLUDE_CONTENTS.lastIndex];\n\n includes.push(include);\n }\n }\n\n this.api.deps.set(filterRanges(exclude, includes));\n\n return content;\n}\n", "import type {AssetInfo, ImageOptions, Location} from './types';\nimport type {ConstructorBlock, PageContent} from '@diplodoc/page-constructor-extension';\n\nimport {load as yamlLoad} from 'js-yaml';\n\nimport {MEDIA_FORMATS, parseLocalUrl, walkLinks} from '~/core/utils';\n\ntype AssetModifier = '!' | '@' | '';\n\nconst modifiers = {'!': 'image', '@': 'video', '': 'link'} as const;\n\nexport function findLink(content: string): string | undefined {\n const rx = /]\\(\\s*/g;\n const match = rx.exec(content);\n if (!match) {\n return undefined;\n }\n\n const link = parseLinkDestination(content, rx.lastIndex);\n\n if (link === null || link.match(/[${}]/)) {\n return undefined;\n }\n\n rx.lastIndex += link.length + 1;\n\n return link;\n}\n\nexport function extractImages(block: ConstructorBlock | string): string[] {\n const images: string[] = [];\n\n if (!block) {\n return images;\n }\n\n if (typeof block === 'string') {\n const trimmedBlock = block.trim();\n\n if (MEDIA_FORMATS.test(trimmedBlock) && trimmedBlock.split(/\\s+/).length === 1) {\n images.push(trimmedBlock);\n }\n\n return images;\n }\n\n walkLinks(block, (value) => {\n if (MEDIA_FORMATS.test(value) && value.split(/\\s+/).length === 1) {\n images.push(value);\n }\n });\n\n return images;\n}\n\nexport function parsePcBlocks(blocks: ConstructorBlock[] = [], images: string[] = []): string[] {\n for (const block of blocks) {\n images.push(...extractImages(block));\n }\n\n return images;\n}\n\nexport function getPcIconTitle(iconPath: string): string {\n const file = iconPath.split('/').pop() || iconPath;\n\n return file.replace(/\\.[^.]+$/, '');\n}\n\nexport const PC_REGEX = /^([ \\t]*):::\\s*page-constructor[ \\t]*\\r?\\n?/m;\n\nexport function findPcImages(content: string): AssetInfo[] {\n const pcImages: AssetInfo[] = [];\n const openRegex = new RegExp(PC_REGEX.source, PC_REGEX.flags);\n\n let searchStart = 0;\n\n while (searchStart < content.length) {\n const remaining = content.slice(searchStart);\n const match = openRegex.exec(remaining);\n\n if (!match) {\n break;\n }\n\n const indent = match[1] || '';\n const matchIndex = searchStart + match.index;\n const startIdx = matchIndex + match[0].length;\n const closeRegex = new RegExp(`^${indent}:::[ \\\\t]*$`, 'm');\n const afterMatch = content.slice(startIdx);\n const closeMatch = closeRegex.exec(afterMatch);\n\n if (!closeMatch) {\n searchStart = startIdx;\n continue;\n }\n\n const rawBlock = afterMatch.slice(0, closeMatch.index);\n let data: PageContent;\n\n try {\n data = yamlLoad(rawBlock) as PageContent;\n } catch {\n searchStart = startIdx;\n continue;\n }\n\n const images = parsePcBlocks(data?.blocks as ConstructorBlock[], []);\n\n for (const img of images) {\n const parsed = parseLocalUrl(img);\n\n if (!parsed) {\n continue;\n }\n\n const blockEnd = startIdx + closeMatch.index + closeMatch[0].length;\n\n pcImages.push({\n ...parsed,\n type: 'image',\n subtype: 'image',\n title: getPcIconTitle(img),\n autotitle: false,\n hash: null,\n search: null,\n location: [matchIndex, blockEnd],\n // no inline svg inside page-constructor because we hasn't a location for asset\n options: {width: undefined, height: undefined, inline: false},\n });\n }\n\n searchStart = startIdx + closeMatch.index + closeMatch[0].length;\n }\n\n return pcImages;\n}\n\nexport function findLinksInfo(content: string): AssetInfo[] {\n const links = find(/]\\(\\s*/g, content, (match, rx) => {\n const link = parseLinkDestination(content, rx.lastIndex);\n const title = parseLinkTitle(content, rx.lastIndex - match[0].length);\n const options = parseLinkOptions(content, rx.lastIndex + (link?.length || 0) + 1);\n\n // TODO: add more precise filter for unix compatible paths\n if (link === null || title === null || link.match(/[${}]/)) {\n return undefined;\n }\n\n const parsed = parseLocalUrl(link);\n if (!parsed) {\n return undefined;\n }\n\n const modifier = content[\n rx.lastIndex - match[0].length - title.length - 2\n ] as AssetModifier;\n const type = modifiers[modifier] || 'link';\n\n rx.lastIndex += link.length + 1;\n\n return {\n ...parsed,\n type,\n subtype: type === 'image' ? 'image' : null,\n title,\n autotitle: type === 'link' && (!title || title === '{#T}'),\n options,\n };\n });\n\n const referenceLinks = find(/]\\[\\s*/g, content, (match, rx) => {\n let link = parseLinkDestination(content, rx.lastIndex, ['[', ']']);\n let title = parseLinkTitle(content, rx.lastIndex - match[0].length);\n const options = parseLinkOptions(content, rx.lastIndex + (link?.length || 0) + 1);\n\n // TODO: add more precise filter for unix compatible paths\n if ((link === null && title === null) || link?.match(/[${}]/)) {\n return undefined;\n }\n title = title || '';\n link = link || title;\n\n const parsed = parseLocalUrl(link);\n if (!parsed) {\n return undefined;\n }\n\n const modifier = content[\n rx.lastIndex - match[0].length - title.length - 2\n ] as AssetModifier;\n const type = modifiers[modifier] || 'link';\n\n rx.lastIndex += (content[rx.lastIndex] === ']' ? 0 : link.length) + 1;\n\n return {\n ...parsed,\n type,\n subtype: 'reference',\n code: link,\n title,\n autotitle: type === 'link' && (!title || title === '{#T}'),\n options,\n };\n });\n\n return [...links, ...referenceLinks];\n}\n\nexport function findDefs(content: string): AssetInfo[] {\n return find(/^\\s*\\[(.*?)]:\\s*([^\\s]+)/gm, content, (match) => {\n const parsed = parseLocalUrl(match[2]);\n if (!parsed) {\n return undefined;\n }\n\n return {\n ...parsed,\n type: 'def',\n code: match[1] || undefined,\n title: '',\n autotitle: true,\n };\n });\n}\n\nfunction find(\n matcher: RegExp,\n content: string,\n map: (match: RegExpMatchArray, rx: RegExp) => Omit<AssetInfo, 'location'> | void,\n): AssetInfo[] {\n const links: AssetInfo[] = [];\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = matcher.exec(content))) {\n const result = map(match, matcher);\n if (!result) {\n continue;\n }\n\n if (result) {\n links.push({\n ...result,\n location: [match.index, matcher.lastIndex],\n });\n }\n }\n\n return links;\n}\n\nfunction parseLinkDestination(str: string, start: number, symbols = ['(', ')']) {\n const max = str.length;\n const [symbolStart, symbolEnd] = symbols.map((symbol) => symbol.charCodeAt(0));\n\n let code,\n level = 0,\n pos = start;\n\n if (str.charCodeAt(pos) === 0x3c /* < */) {\n return parseSimpleLink(str, start + 1);\n }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x20) {\n break;\n }\n\n // ascii control characters\n if (code < 0x20 || code === 0x7f) {\n break;\n }\n\n if (code === 0x5c /* \\ */ && pos + 1 < max) {\n if (str.charCodeAt(pos + 1) === 0x20) {\n break;\n }\n pos += 2;\n continue;\n }\n\n if (code === symbolStart /* ( or [ */) {\n level++;\n if (level > 32) {\n return null;\n }\n }\n\n if (code === symbolEnd /* ) or ] */) {\n if (level === 0) {\n break;\n }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos) {\n return null;\n }\n if (level !== 0) {\n return null;\n }\n\n return str.slice(start, pos);\n}\n\nfunction parseLinkTitle(str: string, start: number) {\n let code,\n prev,\n level = 0,\n pos = start;\n\n while (pos >= 0) {\n code = str.charCodeAt(pos);\n prev = str.charCodeAt(pos - 1);\n\n // ascii control characters\n if (code < 0x20 || code === 0x7f) {\n break;\n }\n\n if (prev === 0x5c /* \\ */) {\n pos -= 2;\n continue;\n }\n\n if (code === 93 /* ] */) {\n level++;\n if (level > 32) {\n return null;\n }\n }\n\n if (code === 91 /* [ */) {\n if (level === 1) {\n break;\n }\n level--;\n }\n\n pos--;\n }\n\n return str.slice(pos + 1, start);\n}\n\nfunction parseLinkOptions(str: string, start: number): ImageOptions {\n const max = str.length;\n const options: ImageOptions = {\n width: undefined,\n height: undefined,\n inline: undefined,\n };\n let code,\n level = 0,\n pos = start,\n startOption = start;\n\n if (str[pos - 1] !== ')') {\n level--;\n }\n if (str.charCodeAt(pos) !== 0x7b /* { */ && level === 0) {\n return options;\n }\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n\n if (code === 0x29 /* ) */ && level === -1) {\n if (str.charCodeAt(pos + 1) !== 0x7b) {\n return options;\n }\n level++;\n }\n\n if (code === 0x7b /* { */ && level > -1) {\n level++;\n startOption = pos + 1;\n if (level > 32) {\n return options;\n }\n }\n\n if (code === 0x7d /* } */) {\n if (level === 1) {\n level--;\n break;\n }\n level--;\n }\n\n pos++;\n }\n\n if (start === pos || level !== 0) {\n return options;\n }\n\n const attrRegex = /(\\w+)=(?:'([^']*)'|\"([^\"]*)\"|(\\S+))/g;\n const optionsString = str.slice(startOption, pos);\n let match;\n\n while ((match = attrRegex.exec(optionsString)) !== null) {\n const key = match[1] as keyof ImageOptions;\n const value = match[2] || match[3] || match[4];\n\n if (key === 'inline') {\n options[key] = value === 'true';\n } else {\n options[key] = value;\n }\n }\n\n return options;\n}\n\nfunction parseSimpleLink(str: string, start: number) {\n const max = str.length;\n\n let code,\n pos = start;\n\n while (pos < max) {\n code = str.charCodeAt(pos);\n if (code === 0x0a /* \\n */) {\n return null;\n }\n if (code === 0x3c /* < */) {\n return null;\n }\n if (code === 0x3e /* > */) {\n return str.slice(start, pos);\n }\n if (code === 0x5c /* \\ */ && pos + 1 < max) {\n pos += 2;\n continue;\n }\n\n pos++;\n }\n\n // no closing '>'\n return null;\n}\n\nexport function filterRanges<T extends {location: Location}>(\n excludes: Location[],\n infos: T[],\n): T[] {\n const contains = (exclude: Location, point: Location) => {\n return (\n (exclude[1] >= point[0] && exclude[1] <= point[1]) ||\n (exclude[0] >= point[0] && exclude[0] < point[1]) ||\n (exclude[0] < point[0] && exclude[1] >= point[1])\n );\n };\n\n return infos.filter((item) => {\n return !excludes.some((exclude) => contains(exclude, item.location));\n });\n}\n\nexport function parseHeading(content: string) {\n const anchors = [];\n const commonHeading = content.match(/^#+/);\n const alternateHeading = content[content.length - 1];\n const alternaleLevels = ['-', '='];\n const level = commonHeading\n ? commonHeading[0].length\n : alternaleLevels.indexOf(alternateHeading) + 1;\n\n if (commonHeading) {\n content = content.replace(/^#+\\s*/, '');\n } else {\n content = content.replace(/\\n[-=]+$/, '');\n }\n\n const ANCHOR = /[^[]{(#[^}]+)}/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = ANCHOR.exec(content))) {\n anchors.push(match[1]);\n content = content.replace(match[0], '');\n ANCHOR.lastIndex -= match[0].length;\n }\n\n const title = content.trim();\n\n return {anchors, title, level};\n}\n", "import type {LoaderContext} from '../loader';\nimport type {AssetInfo} from '../types';\n\nimport {join} from 'node:path';\n\nimport {fs, normalizePath, rebasePath} from '~/core/utils';\n\nimport {filterRanges, findDefs, findLinksInfo, findPcImages} from '../utils';\n\nfunction fixUnreachableLink(path: RelativePath, loaderContext: LoaderContext) {\n let newPath = path;\n const pathnameParts = normalizePath(path).split('/');\n const relativePartsCount = pathnameParts.filter((part: string) => part === '..').length;\n let includedFilePath;\n\n for (let i = 0; i <= relativePartsCount; i++) {\n try {\n includedFilePath = normalizePath(\n join(loaderContext.input, pathnameParts.slice(i).join('/')),\n );\n fs.realpathSync(includedFilePath);\n if (i > 0) {\n newPath = normalizePath(pathnameParts.slice(i).join('/'));\n loaderContext.logger.error(`Path was fixed from ${path} \n to ${newPath}`);\n }\n return newPath;\n } catch {\n if (i === relativePartsCount - 1) {\n return newPath;\n } else {\n continue;\n }\n }\n }\n return newPath;\n}\n\nfunction getSize(\n path: RelativePath,\n loaderContext: LoaderContext,\n assetSizes: Map<RelativePath, number>,\n) {\n if (path === null) {\n return 0;\n }\n if (assetSizes.has(path)) {\n return assetSizes.get(path) as number;\n }\n\n try {\n const fixedPath = fixUnreachableLink(path, loaderContext);\n const fullPath = loaderContext.fullPath(fixedPath);\n const size = fs.statSync(fullPath).size;\n assetSizes.set(path, size);\n return size;\n } catch {\n assetSizes.set(path, 0);\n return 0;\n }\n}\n\nexport function resolveAssets(this: LoaderContext, content: string) {\n const assets: AssetInfo[] = [];\n const assetSizes = new Map<RelativePath, number>();\n\n const exclude = [\n ...this.api.deps.get().map(({location}) => location),\n ...this.api.comments.get(),\n ...this.api.blockCodes.get(),\n ];\n\n const defs = filterRanges(exclude, findDefs(content));\n const links = filterRanges(exclude, findLinksInfo(content));\n const pcImages = filterRanges(exclude, findPcImages(content));\n\n for (const info of [...defs, ...links, ...pcImages]) {\n try {\n if (info.path !== null && !info.path?.startsWith('*') && !info.path?.includes('%')) {\n info.path = rebasePath(this.path, decodeURIComponent(info.path) as RelativePath);\n }\n\n let size = 0;\n if (['def', 'image'].includes(info.type) && info.subtype === 'image') {\n size = getSize(info.path, this, assetSizes);\n }\n\n assets.push({...info, size});\n } catch (error) {\n this.logger.warn(`Error processing asset from ${this.path} to ${info.path}: ${error}`);\n }\n }\n\n this.api.assets.set([...assets]);\n\n return content;\n}\n", "import type {Location} from '../types';\nimport type {LoaderContext} from '../loader';\n\nimport {filterRanges} from '../utils';\n\nexport function resolveHeadings(this: LoaderContext, content: string) {\n const headings = [];\n const exclude = [...this.api.comments.get()];\n\n const heading = /(?<=^|\\n)([#=-])/g;\n\n let match;\n // eslint-disable-next-line no-cond-assign\n while ((match = heading.exec(content))) {\n const [result, location] =\n match[1] === '#'\n ? findCommonHeading(match.index, content)\n : findAlternateHeading(match.index, content);\n\n if (result) {\n headings.push({content: result, location});\n heading.lastIndex = location[1];\n }\n }\n\n this.api.headings.set(filterRanges(exclude, headings));\n\n return content;\n}\n\nconst SPACE = /[ \\t]/;\n\nfunction findCommonHeading(start: number, content: string): [string, Location] | never[] {\n let title = '';\n\n let index = start;\n while (index < content.length) {\n if (index - start > 6) {\n return [];\n }\n\n if (content[index] === '#') {\n index++;\n } else if (content[index].match(SPACE)) {\n break;\n } else {\n return [];\n }\n }\n\n while (index < content.length) {\n if (content[index + 1] && content[index] !== '\\n') {\n title += content[index];\n index++;\n } else if (title.trim()) {\n return [content.slice(start, index), [start, index]];\n } else {\n return [];\n }\n }\n\n return [];\n}\n\nfunction findAlternateHeading(start: number, content: string): [string, Location] | never[] {\n const delim = content[start];\n const newline = [];\n\n let title = '';\n\n let end = start;\n while (end < content.length) {\n if (content[end] === delim) {\n end++;\n } else if (content[end] === '\\n' || !content[end + 1]) {\n break;\n } else {\n return [];\n }\n }\n\n let index = start - 1;\n while (index >= 0) {\n const isContentStart = !index;\n const isTitleStart = newline.length === 2 && !content.slice(...newline).trim();\n\n if (newline.length && !isTitleStart) {\n newline.length = 1;\n }\n\n if (!isTitleStart) {\n title = content[index] + title;\n }\n\n if (isContentStart || isTitleStart) {\n const clean = title.trimStart();\n if (clean) {\n return [content.slice(start - clean.length, end), [start - clean.length, end]];\n } else {\n return [];\n }\n }\n\n if (content[index] === '\\n') {\n newline.unshift(index);\n }\n\n index--;\n }\n\n return [];\n}\n", "import type {LoaderContext} from '../loader';\n\nexport function resolveNoTranslate(this: LoaderContext, content: string) {\n if (this.mode === 'translate') {\n return content;\n }\n\n content = resolveContainerDirectives(content);\n\n content = resolveLeafBlockDirectives(content);\n\n content = resolveInlineDirectives(content);\n\n return content;\n}\n\nfunction resolveContainerDirectives(content: string): string {\n const lines = content.split('\\n');\n const result = [];\n\n const stack = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.trim().startsWith(':::')) {\n const directiveLine = line.trim();\n\n if (directiveLine === ':::') {\n if (stack.length > 0) {\n const lastDirective = stack.pop();\n\n if (lastDirective === 'no-translate' && stack.length === 0) {\n continue;\n }\n\n result.push(line);\n }\n } else {\n const directiveMatch = directiveLine.match(/^:::\\s*([^\\s]+)/);\n const directiveName = directiveMatch ? directiveMatch[1] : '';\n\n if (directiveName === 'no-translate') {\n stack.push('no-translate');\n continue;\n } else {\n stack.push(directiveName);\n result.push(line);\n }\n }\n } else {\n result.push(line);\n }\n }\n\n return result.join('\\n');\n}\n\nfunction resolveLeafBlockDirectives(content: string): string {\n const blockRegex = /::\\s*no-translate\\s*\\[([\\s\\S]*?)\\]/g;\n\n return content.replace(blockRegex, (_, innerContent) => {\n return innerContent;\n });\n}\n\nfunction resolveInlineDirectives(content: string): string {\n const inlineRegex = /(?<![:]):no-translate\\s*\\[([\\s\\S]*?)\\]/g;\n\n return content.replace(inlineRegex, (_, innerContent) => {\n return innerContent;\n });\n}\n", "import type {LoaderContext} from '../loader';\nimport type Token from 'markdown-it/lib/token';\n\nimport MarkdownIt from 'markdown-it';\n// @ts-ignore\nimport deflist from 'markdown-it-deflist';\nimport imsize from '@diplodoc/transform/lib/plugins/imsize';\nimport yfmTable from '@diplodoc/transform/lib/plugins/table';\n\nfunction computeLineStarts(lines: string[]): number[] {\n const lineStarts: number[] = [0];\n for (let i = 1; i < lines.length; i++) {\n const lineEndingLength = 1; //lines[i - 1].endsWith('\\r') ? 2 : 1;\n lineStarts[i] = lineStarts[i - 1] + lines[i - 1].length + lineEndingLength;\n }\n return lineStarts;\n}\n\nconst lineToCharPosition = (line: number, lineStarts: number[], content: string): number =>\n line >= lineStarts.length ? content.length : lineStarts[line];\n\nfunction calculateAdjustedEnd(\n endLine: number,\n lineStarts: number[],\n lines: string[],\n content: string,\n): number {\n let end = content.length;\n if (endLine <= lineStarts.length) {\n end = endLine === 0 ? 0 : lineStarts[endLine - 1] + lines[endLine - 1].length;\n }\n return endLine <= lines.length && endLine > 0 ? end + 1 : end;\n}\n\n// Process block code tokens (fence and code_block)\nfunction processBlockCode(\n token: Token,\n lineStarts: number[],\n lines: string[],\n content: string,\n codes: Array<[number, number]>,\n) {\n if (!token.map || token.map.length !== 2) {\n return;\n }\n\n const [startLine, endLine] = token.map;\n\n const start = lineToCharPosition(startLine, lineStarts, content);\n\n let adjustedEnd: number;\n if (token.type === 'fence' && endLine <= lines.length) {\n const endLineContent = lines[endLine - 1] || '';\n const fenceEndIndex = endLineContent.indexOf(token.markup);\n if (fenceEndIndex > -1) {\n const lineStart = lineStarts[endLine - 1] || 0;\n const fenceEndPos = lineStart + fenceEndIndex + token.markup.length;\n adjustedEnd = fenceEndPos;\n } else {\n adjustedEnd = calculateAdjustedEnd(endLine, lineStarts, lines, content);\n }\n } else {\n adjustedEnd = calculateAdjustedEnd(endLine, lineStarts, lines, content);\n }\n\n codes.push([start, adjustedEnd]);\n}\n\n// Check specific attribute in image part\nfunction checkAttribute(\n imagePart: string,\n matchStart: number,\n codeText: string | null,\n start: number | undefined,\n end: number | undefined,\n regex: RegExp,\n getAttrStart: (matchStart: number, imagePart: string) => number,\n): boolean {\n const match = imagePart.match(regex);\n if (match) {\n if (codeText !== null) {\n // Check if code text is in attributes\n if (match[1].includes(codeText)) {\n return true;\n }\n } else if (start !== undefined && end !== undefined) {\n // Check if code range falls within attributes\n const attrStart = getAttrStart(matchStart, imagePart);\n const attrEnd = attrStart + match[0].length;\n if (start >= attrStart && end <= attrEnd) {\n return true;\n }\n }\n }\n return false;\n}\n\n// Check attributes in image part\nfunction checkImageAttributes(\n imagePart: string,\n matchStart: number,\n codeText: string | null,\n start?: number,\n end?: number,\n): {braceMatch: boolean; quoteMatch: boolean} {\n // Check attributes in curly braces {...}\n const braceMatch = checkAttribute(\n imagePart,\n matchStart,\n codeText,\n start,\n end,\n /\\s*{([^}]*)}/,\n (matchStart, imagePart) => matchStart + imagePart.indexOf('{'),\n );\n\n // Check title attribute in quotes \"...\"\n const quoteMatch = checkAttribute(\n imagePart,\n matchStart,\n codeText,\n start,\n end,\n /\\s*\"([^\"]*)\"/,\n (matchStart, imagePart) => matchStart + imagePart.indexOf('\"'),\n );\n\n return {braceMatch, quoteMatch};\n}\n\n// Add code to array and update position\nfunction addCodeAndUpdatePosition(\n startIndex: number,\n endIndex: number,\n content: string,\n codes: Array<[number, number]>,\n parentStartPos: number,\n lines: string[],\n): number {\n // Check if this code is inside image attributes\n const insideAttrs = isInsideImageAttributes(content, startIndex, endIndex, lines);\n if (!insideAttrs) {\n codes.push([startIndex, endIndex]);\n }\n\n // Update parentStartPos to avoid finding the same match again\n return insideAttrs ? parentStartPos : Math.max(parentStartPos, endIndex);\n}\n\n// Process inline code tokens\nfunction processInlineCode(\n token: Token,\n content: string,\n parentStartPos: number,\n codes: Array<[number, number]>,\n lineStarts: number[],\n lines: string[],\n): number {\n if (!token.markup || !token.content) {\n return parentStartPos;\n }\n\n // Use token's position information if available\n if (token.map && token.map.length === 2) {\n const [startLine, _endLine] = token.map;\n const start = lineToCharPosition(startLine, lineStarts, content);\n\n // Find the exact position of the inline code within the line\n const lineContent = lines[startLine] || '';\n const searchPattern = token.markup + token.content + token.markup;\n const patternIndex = lineContent.indexOf(searchPattern);\n\n if (patternIndex !== -1) {\n const startIndex = start + patternIndex;\n const endIndex = startIndex + searchPattern.length;\n\n return addCodeAndUpdatePosition(\n startIndex,\n endIndex,\n content,\n codes,\n parentStartPos,\n lines,\n );\n }\n } else {\n const searchPattern = token.markup + token.content + token.markup;\n const startIndex = content.indexOf(searchPattern, parentStartPos);\n\n if (startIndex !== -1) {\n const endIndex = startIndex + searchPattern.length;\n\n return addCodeAndUpdatePosition(\n startIndex,\n endIndex,\n content,\n codes,\n parentStartPos,\n lines,\n );\n }\n }\n\n return parentStartPos;\n}\n\n// Function to check if code is inside image attributes\nfunction isInsideImageAttributes(\n content: string,\n start: number,\n end: number,\n lines: string[],\n): boolean {\n // Limit regex search to a smaller window around the code for better performance\n const windowSize = 200; // Reduced window size for better performance\n const checkStart = Math.max(0, start - windowSize);\n const checkEnd = Math.min(content.length, end + windowSize);\n const contentWindow = content.substring(checkStart, checkEnd);\n\n // Only search for images in the limited window\n const imageRegex = /!\\[[^\\]]*\\]\\([^)]*\\)(?:\\s*\"[^\"]*\")?(?:\\s*{[^}]*})?/g;\n\n let match;\n while ((match = imageRegex.exec(contentWindow)) !== null) {\n // Adjust positions to global content positions\n const matchStart = match.index + checkStart;\n const matchEnd = matchStart + match[0].length;\n\n // Check if code range falls within this image\n if (start >= matchStart && end <= matchEnd) {\n // Check if code is in attributes\n const imagePart = match[0];\n // Adjust positions relative to the image part\n const relativeStart = start - matchStart;\n const relativeEnd = end - matchStart;\n const {braceMatch, quoteMatch} = checkImageAttributes(\n imagePart,\n matchStart,\n null,\n relativeStart,\n relativeEnd,\n );\n if (braceMatch || quoteMatch) {\n return true;\n }\n }\n }\n\n // Additional check: if code is in attributes of any image in the document,\n // then it should not be marked as code block\n const codeContent = content.substring(start, end);\n const codeText = codeContent.replace(/`/g, ''); // Remove backticks\n // TODO:goldserg not optimized block (increase time at 6 times)\n // Find all images in the document\n const allImagesRegex = /!\\[[^\\]]*\\]\\([^)]*\\)(?:\\s*\"[^\"]*\")?(?:\\s*{[^}]*})?/gs;\n let imageMatch;\n while ((imageMatch = allImagesRegex.exec(contentWindow)) !== null) {\n // Check if code is in image attributes\n const imagePart = imageMatch[0];\n const {braceMatch, quoteMatch} = checkImageAttributes(\n imagePart,\n imageMatch.index,\n codeText,\n );\n if (braceMatch || quoteMatch) {\n return true;\n }\n }\n\n // Additional check for YFM tables: if code is in one table cell,\n // and image in another cell of the same row, then code should not be marked as code block\n // Check if code is in YFM table context\n let lineIndex = 0;\n let charCount = 0;\n\n // Find the line where the code is located\n for (let i = 0; i < lines.length; i++) {\n if (charCount <= start && start < charCount + lines[i].length + 1) {\n lineIndex = i;\n break;\n }\n charCount += lines[i].length + 1;\n }\n\n // Check if line is in YFM table context\n if (lineIndex > 0 && lineIndex < lines.length - 1) {\n const prevLine = lines[lineIndex - 1];\n const currentLine = lines[lineIndex];\n const nextLine = lines[lineIndex + 1];\n\n // In YFM table, if code is in one cell and image in another,\n // then code should not be marked as code block\n // We need to check if code is in the same line as image\n if (\n prevLine.trim().startsWith('#|') &&\n nextLine.trim().startsWith('|#') &&\n currentLine.includes('\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n// Process inline tokens that may contain inline code\nfunction processInlineToken(\n token: Token,\n lineStarts: number[],\n content: string,\n parentStartPos: number,\n): number {\n if (!token.children || token.children.length === 0) {\n return parentStartPos;\n }\n\n let inlineStartPos = parentStartPos;\n if (token.map && token.map.length === 2) {\n const [startLine] = token.map;\n inlineStartPos = lineToCharPosition(startLine, lineStarts, content);\n }\n\n return inlineStartPos;\n}\n\nexport function resolveBlockCodes(this: LoaderContext, content: string) {\n if (!this.options.mergeContentParts || !content.includes('![')) {\n this.api.blockCodes.set([]);\n return content;\n }\n const md = new MarkdownIt({html: true});\n const diplodocOptions = {\n notesAutotitle: false,\n path: '',\n };\n\n md.use(deflist, diplodocOptions);\n md.use(imsize, diplodocOptions);\n md.use(yfmTable, diplodocOptions);\n\n const tokens = md.parse(content, {});\n\n const codes: Array<[number, number]> = [];\n\n const lines = content.split('\\n');\n const lineStarts = computeLineStarts(lines);\n\n function extractCodeBlocks(\n tokens: Token[],\n parentStartPos = 0,\n parentType: string | null = null,\n ) {\n for (const token of tokens) {\n let currentParentStartPos = parentStartPos;\n\n if (token.type === 'fence' || token.type === 'code_block') {\n processBlockCode(token, lineStarts, lines, content, codes);\n } else if (token.type === 'inline') {\n currentParentStartPos = processInlineToken(\n token,\n lineStarts,\n content,\n currentParentStartPos,\n );\n } else if (token.type === 'code_inline') {\n // Skip code_inline tokens that are children of image tokens\n if (parentType !== 'image') {\n currentParentStartPos = processInlineCode(\n token,\n content,\n currentParentStartPos,\n codes,\n lineStarts,\n lines,\n );\n }\n }\n\n if (token.children && token.children.length > 0) {\n extractCodeBlocks(token.children, currentParentStartPos, token.type);\n }\n }\n }\n\n extractCodeBlocks(tokens);\n\n this.api.blockCodes.set(codes);\n\n return content;\n}\n", "import type {PageContent} from '@diplodoc/page-constructor-extension';\nimport type {LoaderContext} from '../loader';\nimport type {Logger} from '~/core/logger';\n\nimport {dump as yamlDump, load as yamlLoad} from 'js-yaml';\n\nimport {filterBlocksByConditions, hasWhenConditions} from '~/core/utils';\n\nimport {PC_REGEX} from '../utils';\n\ntype Replacement = {\n start: number;\n end: number;\n replacement: string;\n};\n\ntype ProcessOptions = {\n vars: Record<string, unknown>;\n skipMissingVars: boolean;\n logger: Logger;\n path: NormalizedPath;\n};\n\nfunction processPageConstructorBlocks(content: string, options: ProcessOptions): string {\n const {vars, skipMissingVars, logger, path} = options;\n const blocks: Replacement[] = [];\n const openRegex = new RegExp(PC_REGEX.source, PC_REGEX.flags);\n\n let searchStart = 0;\n\n while (searchStart < content.length) {\n const remaining = content.slice(searchStart);\n const match = openRegex.exec(remaining);\n\n if (!match) {\n break;\n }\n\n const indent = match[1] || '';\n const matchIndex = searchStart + match.index;\n const contentStart = matchIndex + match[0].length;\n const closePattern = new RegExp(`^${indent}:::[ \\\\t]*$`, 'm');\n const afterMatch = content.slice(contentStart);\n const closeMatch = closePattern.exec(afterMatch);\n\n if (!closeMatch) {\n searchStart = contentStart;\n continue;\n }\n\n const yamlContent = afterMatch.slice(0, closeMatch.index);\n\n let data: PageContent;\n\n try {\n data = yamlLoad(yamlContent) as PageContent;\n } catch (error) {\n logger.warn(`Failed to parse page-constructor YAML in ${path}: ${error}`);\n searchStart = contentStart;\n continue;\n }\n\n if (!hasWhenConditions(data)) {\n searchStart = contentStart + closeMatch.index + closeMatch[0].length;\n continue;\n }\n\n const filtered = filterBlocksByConditions(data, vars, skipMissingVars);\n const hasBlocks = Array.isArray(filtered.blocks) && filtered.blocks.length > 0;\n\n const blockStart = matchIndex;\n const blockEnd = contentStart + closeMatch.index + closeMatch[0].length;\n\n if (hasBlocks) {\n const yaml = yamlDump(filtered, {\n lineWidth: -1,\n noRefs: true,\n quotingType: \"'\",\n forceQuotes: false,\n });\n\n const indentedYaml = yaml\n .split('\\n')\n .filter((line) => line.trim())\n .map((line) => `${indent}${line}`)\n .join('\\n');\n\n blocks.push({\n start: blockStart,\n end: blockEnd,\n replacement: `${indent}::: page-constructor\\n${indentedYaml}\\n${indent}:::\\n`,\n });\n } else {\n blocks.push({\n start: blockStart,\n end: blockEnd,\n replacement: '',\n });\n }\n\n searchStart = blockEnd;\n }\n\n for (let i = blocks.length - 1; i >= 0; i--) {\n const {start, end, replacement} = blocks[i];\n content = content.slice(0, start) + replacement + content.slice(end);\n }\n\n return content;\n}\n\nexport function resolveConditions(this: LoaderContext, content: string): string {\n const {skipMissingVars = false} = this.options;\n const vars = this.vars || {};\n\n content = processPageConstructorBlocks(content, {\n vars,\n skipMissingVars,\n logger: this.logger,\n path: this.path,\n });\n\n return content;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["dirname", "join", "normalizePath", "parseLocalUrl", "parseLocalUrl", "join", "normalizePath", "rebasePath", "normalizePath", "join", "fullPath", "rebasePath", "matchStart", "imagePart", "tokens", "yamlLoad", "yamlLoad", "normalizePath", "join", "dirname", "headings", "path"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diplodoc/cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.24.1",
|
|
4
4
|
"description": "Make documentation using yfm-docs in Markdown and HTML formats",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"markdown",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"dependencies": {
|
|
79
79
|
"@diplodoc/client": "^5.2.2",
|
|
80
80
|
"@diplodoc/liquid": "^1.4.0",
|
|
81
|
-
"@diplodoc/transform": "^4.
|
|
81
|
+
"@diplodoc/transform": "^4.70.0",
|
|
82
82
|
"@diplodoc/translation": "^1.7.19",
|
|
83
83
|
"@gravity-ui/uikit-themer": "^1.7.0",
|
|
84
84
|
"chalk": "^4.1.2",
|