From 19f969dc17c59bc2392bad2c102f04c866f8dbc5 Mon Sep 17 00:00:00 2001 From: Junx Date: Mon, 13 Feb 2023 16:15:53 +0800 Subject: [PATCH 1/2] Rename Layout to Typescript --- .eslintignore | 42 ++++++++++++------- .gitignore | 37 ++++++++++------ .../core/src/Layout/{Layout.js => Layout.ts} | 0 .../{LayoutManager.js => LayoutManager.ts} | 0 .../core/src/Layout/{index.js => index.ts} | 0 5 files changed, 52 insertions(+), 27 deletions(-) rename packages/core/src/Layout/{Layout.js => Layout.ts} (100%) rename packages/core/src/Layout/{LayoutManager.js => LayoutManager.ts} (100%) rename packages/core/src/Layout/{index.js => index.ts} (100%) diff --git a/.eslintignore b/.eslintignore index 1984397478..894268870a 100644 --- a/.eslintignore +++ b/.eslintignore @@ -16,20 +16,34 @@ packages/core/src/html/**/*.js packages/core/src/Layout/*.js packages/core/src/lib/nunjucks-extensions/*.js packages/core/src/lib/markdown-it/index.js -packages/core/src/lib/markdown-it/highlight/*.js -packages/core/src/lib/markdown-it/utils/*.js -packages/core/src/Page/*.js -packages/core/src/plugins/**/*.js -packages/core/src/Site/*.js -packages/core/src/utils/*.js -packages/core/src/variables/*.js -packages/core/test/unit/**/*.js - -# TODO: remove when migrated to TS -!packages/core/src/Site/index.js -!packages/core/test/unit/lib/nunjucks-extensions/*.js -!markdown-it-icons.test.js -!Site.test.js +packages/core/src/lib/markdown-it/utils/index.js +packages/core/src/lib/markdown-it/highlight/helper.js +packages/core/src/lib/markdown-it/highlight/HighlightRule.js +packages/core/src/lib/markdown-it/highlight/HighlightRuleComponent.js +packages/core/src/lib/markdown-it/plugins/markdown-it-icons.js +packages/core/test/unit/html/NodeProcessor.test.js +packages/core/test/unit/html/NodeProcessor.data.js +packages/core/test/unit/html/linkProcessor.test.js +packages/core/test/unit/html/includePanelProcessor.test.js +packages/core/test/unit/html/SiteLinkManager.test.js +packages/core/test/unit/utils/utils.js +packages/core/test/unit/utils/data.js +packages/core/src/plugins/default/markbind-plugin-anchors.js +packages/core/src/plugins/default/markbind-plugin-plantuml.js +packages/core/src/plugins/default/markbind-plugin-shorthandSyntax.js +packages/core/src/plugins/default/markbind-plugin-tree.js +packages/core/test/unit/plugins/default/anchor.test.js +packages/core/test/unit/plugins/default/plantuml.test.js +packages/core/test/unit/plugins/default/shorthandSyntax.test.js +packages/core/test/unit/plugins/default/tree.test.js +packages/core/src/plugins/algolia.js +packages/core/src/plugins/disqus.js +packages/core/src/plugins/filterTags.js +packages/core/src/plugins/googleAnalytics.js +packages/core/src/plugins/mathDelimiters.js +packages/core/src/Layout/index.js +packages/core/src/Layout/Layout.js +packages/core/src/Layout/LayoutManager.js # Rules for pure JS files packages/core/src/lib/markdown-it/patches/* diff --git a/.gitignore b/.gitignore index c65314f158..da6cf2387a 100644 --- a/.gitignore +++ b/.gitignore @@ -81,18 +81,29 @@ packages/core/src/lib/nunjucks-extensions/*.js packages/core/src/lib/markdown-it/index.js packages/core/src/lib/markdown-it/highlight/*.js packages/core/src/lib/markdown-it/plugins/markdown-it-icons.js -packages/core/src/lib/markdown-it/utils/*.js -packages/core/src/Page/*.js -packages/core/src/plugins/**/*.js -packages/core/src/Site/*.js -packages/core/src/utils/*.js -packages/core/src/variables/*.js -packages/core/test/unit/**/*.js - -# TODO: remove when migrated to TS -!packages/core/src/Site/index.js -!packages/core/test/unit/lib/nunjucks-extensions/*.js -!markdown-it-icons.test.js -!Site.test.js +packages/core/src/Page/index.js +packages/core/test/unit/html/NodeProcessor.test.js +packages/core/test/unit/html/NodeProcessor.data.js +packages/core/test/unit/html/linkProcessor.test.js +packages/core/test/unit/html/includePanelProcessor.test.js +packages/core/test/unit/html/SiteLinkManager.test.js +packages/core/test/unit/utils/utils.js +packages/core/test/unit/utils/data.js +packages/core/src/plugins/default/markbind-plugin-anchors.js +packages/core/src/plugins/default/markbind-plugin-plantuml.js +packages/core/src/plugins/default/markbind-plugin-shorthandSyntax.js +packages/core/src/plugins/default/markbind-plugin-tree.js +packages/core/test/unit/plugins/default/anchor.test.js +packages/core/test/unit/plugins/default/plantuml.test.js +packages/core/test/unit/plugins/default/shorthandSyntax.test.js +packages/core/test/unit/plugins/default/tree.test.js +packages/core/src/plugins/algolia.js +packages/core/src/plugins/disqus.js +packages/core/src/plugins/filterTags.js +packages/core/src/plugins/googleAnalytics.js +packages/core/src/plugins/mathDelimiters.js +packages/core/src/Layout/index.js +packages/core/src/Layout/Layout.js +packages/core/src/Layout/LayoutManager.js # --- packages/core end --- diff --git a/packages/core/src/Layout/Layout.js b/packages/core/src/Layout/Layout.ts similarity index 100% rename from packages/core/src/Layout/Layout.js rename to packages/core/src/Layout/Layout.ts diff --git a/packages/core/src/Layout/LayoutManager.js b/packages/core/src/Layout/LayoutManager.ts similarity index 100% rename from packages/core/src/Layout/LayoutManager.js rename to packages/core/src/Layout/LayoutManager.ts diff --git a/packages/core/src/Layout/index.js b/packages/core/src/Layout/index.ts similarity index 100% rename from packages/core/src/Layout/index.js rename to packages/core/src/Layout/index.ts From f11595a93c3cd3dea8f815606875a9498461062a Mon Sep 17 00:00:00 2001 From: Junx Date: Thu, 30 Mar 2023 01:10:54 +0800 Subject: [PATCH 2/2] Adapt Layout to TypeScript --- packages/core/src/Layout/Layout.ts | 52 ++++++++++++++++------- packages/core/src/Layout/LayoutManager.ts | 32 +++++++------- packages/core/src/Layout/index.ts | 13 ++---- packages/core/src/Page/PageConfig.ts | 5 ++- packages/core/src/Page/index.ts | 16 +++---- 5 files changed, 66 insertions(+), 52 deletions(-) diff --git a/packages/core/src/Layout/Layout.ts b/packages/core/src/Layout/Layout.ts index 04bc82db6c..ed8923579e 100644 --- a/packages/core/src/Layout/Layout.ts +++ b/packages/core/src/Layout/Layout.ts @@ -1,14 +1,39 @@ -const { v4: uuidv4 } = require('uuid'); +import { v4 as uuidv4 } from 'uuid'; -const { PageSources } = require('../Page/PageSources'); -const { NodeProcessor } = require('../html/NodeProcessor'); +import { PageSources } from '../Page/PageSources'; +import { NodeProcessor, NodeProcessorConfig } from '../html/NodeProcessor'; -const logger = require('../utils/logger'); +import * as logger from '../utils/logger'; +import { VariableProcessor } from '../variables/VariableProcessor'; +import { PluginManager } from '../plugins/PluginManager'; +import { SiteLinkManager } from '../html/SiteLinkManager'; +import { ExternalManager } from '../External/ExternalManager'; const LAYOUT_PAGE_BODY_VARIABLE = 'content'; -class Layout { - constructor(sourceFilePath, config) { +export type LayoutConfig = { + pluginManager: PluginManager; + siteLinkManager: SiteLinkManager; + variableProcessor: VariableProcessor; + externalManager: ExternalManager; +} & NodeProcessorConfig; + +export class Layout { + sourceFilePath: string; + config: LayoutConfig; + + includedFiles: Set; + layoutProcessed: string; + layoutPageBodyVariable: string; + layoutPageNavUuid: string; + headTop: string[]; + headBottom: string[]; + scriptBottom: string[]; + layoutUserScriptsAndStyles: string[]; + + generatePromise?: Promise; + + constructor(sourceFilePath: string, config: LayoutConfig) { this.sourceFilePath = sourceFilePath; this.config = config; @@ -20,11 +45,9 @@ class Layout { this.headBottom = []; this.scriptBottom = []; this.layoutUserScriptsAndStyles = []; - - this.generatePromise = undefined; } - shouldRegenerate(filePaths) { + shouldRegenerate(filePaths: string[]) { return filePaths.some(filePath => this.includedFiles.has(filePath)); } @@ -51,8 +74,9 @@ class Layout { pluginManager, siteLinkManager, this.layoutUserScriptsAndStyles, 'layout'); // eslint-disable-next-line no-await-in-loop - this.layoutProcessed = await nodeProcessor.process(this.sourceFilePath, nunjucksProcessed, - this.sourceFilePath, layoutVariables); + this.layoutProcessed = (await nodeProcessor.process(this.sourceFilePath, nunjucksProcessed, + this.sourceFilePath, layoutVariables)) as string; + this.layoutPageNavUuid = nodeProcessor.pageNavProcessor.getUuid(); this.layoutProcessed = pluginManager.postRender(nodeProcessor.frontmatter, this.layoutProcessed); @@ -79,7 +103,7 @@ class Layout { this.includedFiles); } - insertPage(pageContent, pageNav, pageIncludedFiles) { + insertPage(pageContent: string, pageNav: string, pageIncludedFiles: Set) { this.includedFiles.forEach(filePath => pageIncludedFiles.add(filePath)); // Use function for .replace, in case string contains special patterns (e.g. $$, $&, $1, ...) @@ -97,7 +121,3 @@ class Layout { }; } } - -module.exports = { - Layout, -}; diff --git a/packages/core/src/Layout/LayoutManager.ts b/packages/core/src/Layout/LayoutManager.ts index 677543bce2..4f7748dd98 100644 --- a/packages/core/src/Layout/LayoutManager.ts +++ b/packages/core/src/Layout/LayoutManager.ts @@ -1,14 +1,18 @@ -const fs = require('fs-extra'); -const path = require('path'); +import * as fs from 'fs-extra'; +import * as path from 'path'; -const { Layout } = require('./Layout'); +import { Layout, LayoutConfig } from './Layout'; -const logger = require('../utils/logger'); +import * as logger from '../utils/logger'; const FRONTMATTER_NONE_ATTR = 'none'; -class LayoutManager { - constructor(config) { +export class LayoutManager { + layouts: Record; + layoutsRootPath: string; + config: LayoutConfig; + + constructor(config: LayoutConfig) { this.config = config; this.layoutsRootPath = path.join(config.rootPath, '_markbind', 'layouts'); @@ -26,7 +30,7 @@ class LayoutManager { /** * Update layouts which have the provided filePaths as dependencies */ - updateLayouts(filePaths) { + updateLayouts(filePaths: string[]) { const layoutsToRegenerate = Object.entries(this.layouts) .filter(([, layout]) => layout.shouldRegenerate(filePaths)); @@ -36,7 +40,7 @@ class LayoutManager { })); } - generateLayoutIfNeeded(name) { + generateLayoutIfNeeded(name: string) { if (this.layouts[name]) { return this.layouts[name].generatePromise; } @@ -52,7 +56,7 @@ class LayoutManager { return this.layouts[name].generatePromise; } - layoutHasPageNav(name) { + layoutHasPageNav(name: string) { if (name === FRONTMATTER_NONE_ATTR) { return false; } @@ -60,7 +64,7 @@ class LayoutManager { return this.layouts[name] && this.layouts[name].layoutPageNavUuid; } - combineLayoutWithPage(name, pageContent, pageNav, pageIncludedFiles) { + combineLayoutWithPage(name: string, pageContent: string, pageNav: string, pageIncludedFiles: Set) { if (name === FRONTMATTER_NONE_ATTR) { return pageContent; } @@ -69,10 +73,10 @@ class LayoutManager { return pageContent; } - return this.layouts[name].insertPage(pageContent, pageNav, pageIncludedFiles); + return this.layouts[name].insertPage(pageContent, pageNav, new Set(pageIncludedFiles)); } - getLayoutPageNjkAssets(name) { + getLayoutPageNjkAssets(name: string) { if (name === FRONTMATTER_NONE_ATTR || !this.layouts[name]) { return {}; } @@ -80,7 +84,3 @@ class LayoutManager { return this.layouts[name].getPageNjkAssets(); } } - -module.exports = { - LayoutManager, -}; diff --git a/packages/core/src/Layout/index.ts b/packages/core/src/Layout/index.ts index 93b7d82878..958da95dea 100644 --- a/packages/core/src/Layout/index.ts +++ b/packages/core/src/Layout/index.ts @@ -1,9 +1,4 @@ -const { Layout } = require('./Layout'); -const { LayoutManager } = require('./LayoutManager'); - -module.exports = { - Layout, - LayoutManager, - LAYOUT_DEFAULT_NAME: 'default.md', - LAYOUT_FOLDER_PATH: '_markbind/layouts', -}; +export { Layout } from './Layout'; +export { LayoutManager } from './LayoutManager'; +export const LAYOUT_DEFAULT_NAME = 'default.md'; +export const LAYOUT_FOLDER_PATH = '_markbind/layouts'; diff --git a/packages/core/src/Page/PageConfig.ts b/packages/core/src/Page/PageConfig.ts index 483875f7d2..90f6ac0a12 100644 --- a/packages/core/src/Page/PageConfig.ts +++ b/packages/core/src/Page/PageConfig.ts @@ -3,6 +3,7 @@ import type { SiteLinkManager } from '../html/SiteLinkManager'; import type { PluginManager } from '../plugins/PluginManager'; import { VariableProcessor } from '../variables/VariableProcessor'; +import { LayoutManager } from '../Layout'; export interface PageAssets { bootstrap: string; @@ -67,7 +68,7 @@ export class PageConfig { template: Template; variableProcessor: VariableProcessor; addressablePagesSource: string[]; - layoutManager: any; + layoutManager: LayoutManager; constructor(args: { asset: PageAssets; @@ -89,7 +90,7 @@ export class PageConfig { template: Template; variableProcessor: VariableProcessor; addressablePagesSource: string[]; - layoutManager: any; + layoutManager: LayoutManager; }) { this.asset = args.asset; this.baseUrlMap = args.baseUrlMap; diff --git a/packages/core/src/Page/index.ts b/packages/core/src/Page/index.ts index 30e4a06940..8cd6395825 100644 --- a/packages/core/src/Page/index.ts +++ b/packages/core/src/Page/index.ts @@ -18,6 +18,7 @@ import type { SiteConfig } from '../Site/SiteConfig'; import type { FrontMatter } from '../plugins/Plugin'; import type { ExternalManager } from '../External/ExternalManager'; import { MbNode } from '../utils/node'; +import { LAYOUT_DEFAULT_NAME } from '../Layout/index'; require('../patches/htmlparser2'); @@ -25,10 +26,6 @@ const _ = { cloneDeep, isObject, isArray }; const PACKAGE_VERSION = require('../../package.json').version; -const { - LAYOUT_DEFAULT_NAME, -} = require('../Layout'); - const TITLE_PREFIX_SEPARATOR = ' - '; const TITLE_SUFFIX_SEPARATOR = ' - '; @@ -443,7 +440,8 @@ export class Page { */ buildPageNav(content: string) { const isFmPageNavSpecifierValid = this.isPageNavigationSpecifierValid(); - const doesLayoutHavePageNav = this.pageConfig.layoutManager.layoutHasPageNav(this.layout); + const doesLayoutHavePageNav = this.layout ? this.pageConfig.layoutManager.layoutHasPageNav( + this.layout) : false; if (isFmPageNavSpecifierValid && doesLayoutHavePageNav) { this.navigableHeadings = {}; @@ -502,13 +500,13 @@ export class Page { const pageContent = content; pluginManager.collectPluginPageNjkAssets(this.frontmatter, content, this.asset); - - await layoutManager.generateLayoutIfNeeded(this.layout); + await layoutManager.generateLayoutIfNeeded(this.layout ?? LAYOUT_DEFAULT_NAME); const pageNav = this.buildPageNav(content); - content = layoutManager.combineLayoutWithPage(this.layout, content, pageNav, this.includedFiles); + content = layoutManager.combineLayoutWithPage(this.layout ?? LAYOUT_DEFAULT_NAME, + content, pageNav, this.includedFiles); this.asset = { ...this.asset, - ...layoutManager.getLayoutPageNjkAssets(this.layout), + ...layoutManager.getLayoutPageNjkAssets(this.layout ?? LAYOUT_DEFAULT_NAME), }; pageSources.addAllToSet(this.includedFiles);