forked from github/docs
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move the rewriteLocalLinks behavior to an AST pipeline plugin (github…
…#17550) * Write our plugin * Include it * Move the RegEx * Don't rewriteLocalLinks with cheerio anymore * Process after HTML ast is generated * Use the same logic as before, just to see if it'll pass * Don't require languageCode/version * Only work on local links * Needs an href * Only update href if there's a new one to use * Check for node.properties * Some links are just mean
- Loading branch information
Showing
4 changed files
with
106 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
const path = require('path') | ||
const visit = require('unist-util-visit') | ||
const externalRedirects = Object.keys(require('../../redirects/external-sites')) | ||
const { getPathWithoutLanguage, getVersionStringFromPath } = require('../../path-utils') | ||
const { getNewVersionedPath } = require('../../old-versions-utils') | ||
const patterns = require('../../patterns') | ||
const { deprecated, latest } = require('../../enterprise-server-releases') | ||
const nonEnterpriseDefaultVersion = require('../../non-enterprise-default-version') | ||
const allVersions = require('../../all-versions') | ||
const supportedVersions = Object.keys(allVersions) | ||
const supportedPlans = Object.values(allVersions).map(v => v.plan) | ||
const removeFPTFromPath = require('../../remove-fpt-from-path') | ||
|
||
// Matches any <a> tags with an href that starts with `/` | ||
const matcher = node => ( | ||
node.type === 'element' && | ||
node.tagName === 'a' && | ||
node.properties && | ||
node.properties.href && | ||
node.properties.href.startsWith('/') | ||
) | ||
|
||
// Content authors write links like `/some/article/path`, but they need to be | ||
// rewritten on the fly to match the current language and page version | ||
module.exports = function rewriteLocalLinks ({ languageCode, version }) { | ||
// There's no languageCode or version passed, so nothing to do | ||
if (!languageCode || !version) return | ||
|
||
return ast => { | ||
visit(ast, matcher, node => { | ||
const newHref = getNewHref(node, languageCode, version) | ||
if (newHref) { | ||
node.properties.href = newHref | ||
} | ||
}) | ||
} | ||
} | ||
|
||
function getNewHref (node, languageCode, version) { | ||
const { href } = node.properties | ||
// Exceptions to link rewriting | ||
if (href.startsWith('/assets')) return | ||
if (href.startsWith('/public')) return | ||
if (externalRedirects.includes(href)) return | ||
|
||
let newHref = href | ||
// If the link has a hardcoded plan or version in it, do not update other than adding a language code | ||
// Examples: | ||
// /[email protected]/rest/reference/oauth-authorizations | ||
// /enterprise-server/rest/reference/oauth-authorizations (this redirects to the latest version) | ||
// /enterprise-server@latest/rest/reference/oauth-authorizations (this redirects to the latest version) | ||
const firstLinkSegment = href.split('/')[1] | ||
if ([...supportedPlans, ...supportedVersions, 'enterprise-server@latest'].includes(firstLinkSegment)) { | ||
newHref = path.join('/', languageCode, href) | ||
} | ||
|
||
// If the link includes a deprecated version, do not update other than adding a language code | ||
// Example: /enterprise/11.10.340/admin/articles/upgrading-to-the-latest-release | ||
const oldEnterpriseVersionNumber = href.match(patterns.getEnterpriseVersionNumber) | ||
if (oldEnterpriseVersionNumber && deprecated.includes(oldEnterpriseVersionNumber[1])) { | ||
newHref = path.join('/', languageCode, href) | ||
} | ||
|
||
if (newHref === href) { | ||
// start clean with no language (TOC pages already include the lang codes via lib/liquid-tags/link.js) | ||
const hrefWithoutLang = getPathWithoutLanguage(href) | ||
|
||
// normalize any legacy links so they conform to new link structure | ||
newHref = path.posix.join('/', languageCode, getNewVersionedPath(hrefWithoutLang)) | ||
|
||
// get the current version from the link | ||
const versionFromHref = getVersionStringFromPath(newHref) | ||
|
||
// ------ BEGIN ONE-OFF OVERRIDES ------// | ||
// dotcom-only links always point to dotcom | ||
if (node.properties.className && node.properties.className.includes('dotcom-only')) { | ||
version = nonEnterpriseDefaultVersion | ||
} | ||
|
||
// desktop links always point to dotcom | ||
if (patterns.desktop.test(hrefWithoutLang)) { | ||
version = nonEnterpriseDefaultVersion | ||
} | ||
|
||
// admin links on dotcom always point to Enterprise | ||
if (patterns.adminProduct.test(hrefWithoutLang) && version === nonEnterpriseDefaultVersion) { | ||
version = `enterprise-server@${latest}` | ||
} | ||
|
||
// insights links on dotcom always point to Enterprise | ||
if (patterns.insightsProduct.test(hrefWithoutLang) && version === nonEnterpriseDefaultVersion) { | ||
version = `enterprise-server@${latest}` | ||
} | ||
// ------ END ONE-OFF OVERRIDES ------// | ||
|
||
// update the version in the link | ||
newHref = removeFPTFromPath(newHref.replace(versionFromHref, version)) | ||
} | ||
|
||
newHref = newHref.replace(patterns.trailingSlash, '$1') | ||
return newHref | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters