Branch

Skip things that can't be done if plugins are missing

Sat Sep 27 2025

Tucker McKnight <tmcknight@instructure.com>

RSS feed creationg, syntax highlighting, and readme display rely
on other 11ty plugins being installed in order for them to work.
If those plugins are not installed, skip those parts of the site
generation.

3d2bce97c01a5a43175463c0b37e5d74c18813a2

Side-by-side
Stacked
main.ts:15
Before
15 16 17
  // TODO: check if the render plugin is available and throw an error otherwise
  // TODO: check if the highlight function is available
  // TODO: throw an error if reposConfiguration is undefined
After
15
main.ts:109
Before
109
    return eleventyConfig.javascript.functions.highlight(language, code)
After
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
    const highlighter = eleventyConfig?.javascript?.functions?.highlight
    if (highlighter) {
      return highlighter(language, code)
    }
    else {
      return code
    }
  })

  eleventyConfig.addAsyncFilter("renderContentIfAvailable", async (contentString, contentType) => {
    const renderer = eleventyConfig?.javascript?.functions?.renderContent
    if (renderer) {
      return await renderer.bind({})(contentString, contentType)
    }
    else {
      return `<pre>${contentString}</pre>`
    }
main.ts:399
Before
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416
  const feedTemplate = fsImport.readFileSync(`${import.meta.dirname}/templates/feed.njk`).toString()
  eleventyConfig.addTemplate(
    `repos/feed.njk`,
    feedTemplate,
    {
      pagination: {
        data: "branches",
        size: 1,
        alias: "branch",
      },
      permalink: (data) => {
        const repoName = data.branch.repoName
        const branchName = data.branch.branchName
        return `${reposPath}/${eleventyConfig.getFilter("slugify")(repoName)}/branches/${eleventyConfig.getFilter("slugify")(branchName)}/patches.xml`
      },
      eleventyExcludeFromCollections: true,
    }
  )
After
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
  // htmlBaseUrl is a function defined by the 11ty RSS plugin.
  // Skip this virtual template if the 11ty RSS plugin is not being used.
  let rssAvailable = false
  if (eleventyConfig?.javascript?.functions?.htmlBaseUrl) {
    rssAvailable = true
    const feedTemplate = fsImport.readFileSync(`${import.meta.dirname}/templates/feed.njk`).toString()
    eleventyConfig.addTemplate(
      `repos/feed.njk`,
      feedTemplate,
      {
        pagination: {
          data: "branches",
          size: 1,
          alias: "branch",
        },
        permalink: (data) => {
          const repoName = data.branch.repoName
          const branchName = data.branch.branchName
          return `${reposPath}/${eleventyConfig.getFilter("slugify")(repoName)}/branches/${eleventyConfig.getFilter("slugify")(branchName)}/patches.xml`
        },
        eleventyExcludeFromCollections: true,
      }
    )
  }

  // This is used to show/hide the RSS feed link on the landing page.
  eleventyConfig.addGlobalData('rssAvailable', rssAvailable)
templates/repo.njk:1
Before
1
    {{ branch.repoName | getReadMe(branch.branchName) | renderContent("md") | safe }}
After
1
    {{ branch.repoName | getReadMe(branch.branchName) | renderContentIfAvailable("md") | safe }}
templates/repo.njk:9
Before
9 10 11
          <div class="col-auto">
            <a href="{{reposPath}}/{{ branch.repoName | slugify }}/branches/{{ branch.branchName | slugify }}/patches.xml" class="initialism">RSS<i class="bi bi-rss-fill ms-2" style="color: orange;"></i></a>
          </div>
After
9 10 11 12 13
          {% if rssAvailable %}
            <div class="col-auto">
              <a href="{{reposPath}}/{{ branch.repoName | slugify }}/branches/{{ branch.branchName | slugify }}/patches.xml" class="initialism">RSS<i class="bi bi-rss-fill ms-2" style="color: orange;"></i></a>
            </div>
          {% endif %}