// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. const markdownItReplaceLink = require("markdown-it-replace-link"); module.exports = function (eleventyConfig) { const pathPrefix = process.env.GITHUB_REPOSITORY ? process.env.GITHUB_REPOSITORY.split("/")[1] : "TypeAgent"; // Copy static assets eleventyConfig.addPassthroughCopy("_includes"); eleventyConfig.addPassthroughCopy("assets"); eleventyConfig.addPassthroughCopy("content/imgs"); eleventyConfig.addPassthroughCopy("content/tutorial/imgs"); eleventyConfig.addShortcode("version", function () { return String(Date.now()); }); // Add a shortcode for the current year eleventyConfig.addShortcode("year", function () { return new Date().getFullYear(); }); let markdownIt = require("markdown-it"); let markdownItAnchor = require("markdown-it-anchor"); let options = { html: true, breaks: true, linkify: true, }; // Add a shortcode for repository links eleventyConfig.addShortcode("repo", function (path, text) { const repoUrl = process.env.GITHUB_REPOSITORY ? `https://github.com/${process.env.GITHUB_REPOSITORY}` : this.ctx?.site?.github || "https://github.com/microsoft/TypeAgent"; const defaultBranch = process.env.GITHUB_DEFAULT_BRANCH || "main"; const normalizedPath = path.replace(/^\.\.\/|^\//g, ""); // Determine the correct GitHub URL based on whether it's a file or directory const isDirectory = !normalizedPath.includes("."); const githubUrl = isDirectory ? `${repoUrl}/tree/${defaultBranch}/${normalizedPath}` : `${repoUrl}/blob/${defaultBranch}/${normalizedPath}`; // Return markdown link return `[${text || normalizedPath}](${githubUrl})`; }); // Add debugging shortcode to show the current URL eleventyConfig.addShortcode("debugUrl", function () { return `

Debug Path Information:

Path Prefix: ${pathPrefix}

Full Base URL: ${this.page ? this.page.url : "No page context"}

`; }); // Set up markdown-it with the plugins eleventyConfig.setLibrary( "md", markdownIt(options) .use(markdownItAnchor, { permalink: true, permalinkClass: "direct-link", permalinkSymbol: "#", }) .use(markdownItReplaceLink, { replaceLink: function (link, env) { // Only process relative image links that don't start with "/" if ( link && !link.startsWith("/") && !link.startsWith("http") && !link.startsWith("#") && /\.(jpeg|jpg|gif|png|svg)$/.test(link) ) { // Get the file path from the environment const inputPath = env.page.inputPath; // Extract directory from the input path const dir = inputPath.substring(0, inputPath.lastIndexOf("/")); // For images in the same directory as the markdown file, // construct a path relative to the site root if (dir.includes("/tutorial") && link.startsWith("imgs/")) { return `/TypeAgent/content/tutorial/imgs/${link.substring(5)}`; } if (dir.includes("/content")) { const index = link.indexOf("imgs/"); return `/TypeAgent/content/imgs/${link.substring(index + 5)}`; } return link; } return link; }, }) ); // Create a collection for documentation pages eleventyConfig.addCollection("docs", function (collection) { return collection .getFilteredByGlob("content/**/*.md") .filter((item) => !item.filePathStem.includes("index")); }); // Store a map of input paths to output paths const pageMap = new Map(); eleventyConfig.addTransform("recordPaths", function (content, outputPath) { const inputPath = this.inputPath; if (inputPath && outputPath) { pageMap.set(outputPath, inputPath); } return content; }); const { updateLinks } = require("./scripts/update-links"); eleventyConfig.addTransform("updateLinks", function (content, outputPath) { if (!outputPath || !outputPath.endsWith(".html")) { return content; // Only process HTML files } // Get the original input path for this file const inputPath = pageMap.get(outputPath) || this.inputPath; if (!inputPath) { console.warn( `No input path found for ${outputPath}, skipping link transformation` ); return content; } const repoUrl = process.env.GITHUB_REPOSITORY ? `https://github.com/${process.env.GITHUB_REPOSITORY}` : this.ctx?.site?.github || "https://github.com/microsoft/TypeAgent"; const defaultBranch = process.env.GITHUB_DEFAULT_BRANCH || "main"; console.log(`Transforming links in: ${outputPath} (from ${inputPath})`); return updateLinks(content, outputPath, inputPath, repoUrl, defaultBranch); }); // Add a filter for GitHub repository URLs eleventyConfig.addFilter("githubUrl", function (path, isDirectory = false) { const repoUrl = process.env.GITHUB_REPOSITORY ? `https://github.com/${process.env.GITHUB_REPOSITORY}` : this.ctx?.site?.github || "https://github.com/microsoft/TypeAgent"; const defaultBranch = process.env.GITHUB_DEFAULT_BRANCH || "main"; const normalizedPath = path.replace(/^\.\.\/|^\//g, ""); return isDirectory ? `${repoUrl}/tree/${defaultBranch}/${normalizedPath}` : `${repoUrl}/blob/${defaultBranch}/${normalizedPath}`; }); return { dir: { // Input directory is the current directory (docs folder) input: ".", // Output to a _site subdirectory within docs output: "_site", // Layouts are in _includes includes: "_includes", // Data files are in _data data: "_data", // Content files are in the content directory layouts: "_includes", }, templateFormats: ["md", "njk", "html"], markdownTemplateEngine: "njk", htmlTemplateEngine: "njk", dataTemplateEngine: "njk", passthroughFileCopy: true, pathPrefix: `/${pathPrefix}/`, }; };