diff --git a/lib/core/nav/HeaderNav.js b/lib/core/nav/HeaderNav.js index bf2b128486..1b6728e687 100644 --- a/lib/core/nav/HeaderNav.js +++ b/lib/core/nav/HeaderNav.js @@ -7,11 +7,20 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -const React = require("react"); +const CWD = process.cwd(); -const siteConfig = require(process.cwd() + "/siteConfig.js"); +const React = require("react"); +const fs = require("fs"); +const siteConfig = require(CWD + "/siteConfig.js"); const translation = require("../../server/translation.js"); +const ENABLE_TRANSLATION = fs.existsSync(CWD + "/languages.js"); +const ENABLE_VERSIONING = fs.existsSync(CWD + "/versions.json"); +let versions; +if (ENABLE_VERSIONING) { + versions = require(CWD + "/versions.json"); +} + class LanguageDropDown extends React.Component { render() { const enabledLanguages = []; @@ -135,6 +144,11 @@ class HeaderNav extends React.Component { } render() { + const versionsLink = + this.props.baseUrl + + (ENABLE_TRANSLATION + ? this.props.language + "/versions.html" + : "versions.html"); return (
@@ -146,6 +160,12 @@ class HeaderNav extends React.Component { {this.props.title} } + {ENABLE_VERSIONING && + +

+ {this.props.version || versions[0]} +

+
} {this.renderResponsiveNav()}
diff --git a/lib/server/generate.js b/lib/server/generate.js index 42b8882738..4a0979f3d7 100644 --- a/lib/server/generate.js +++ b/lib/server/generate.js @@ -23,8 +23,10 @@ function execute() { const versionFallback = require("./versionFallback.js"); const ENABLE_TRANSLATION = fs.existsSync(CWD + "/languages.js"); + const ENABLE_VERSIONING = fs.existsSync(CWD + "/versions.json"); + let languages; - if (fs.existsSync(CWD + "/languages.js")) { + if (ENABLE_TRANSLATION) { languages = require(CWD + "/languages.js"); } else { languages = [ @@ -84,10 +86,11 @@ function execute() { const mdToHtml = {}; Object.keys(Metadata).forEach(id => { const metadata = Metadata[id]; - if (metadata.language !== "en" || metadata.version) { + if (metadata.language !== "en" || metadata.original_id) { return; } - let htmlLink = siteConfig.baseUrl + metadata.permalink; + let htmlLink = + siteConfig.baseUrl + metadata.permalink.replace("/next/", "/"); if (htmlLink.includes("/docs/en/")) { htmlLink = htmlLink.replace("/docs/en/", "/docs/en/VERSION/"); } else { @@ -105,7 +108,7 @@ function execute() { const metadata = Metadata[id]; let file; - if (metadata.version) { + if (metadata.original_id) { if (ENABLE_TRANSLATION && metadata.language !== "en") { file = CWD + "/translated_docs/" + metadata.language + "/" + metadata.source; @@ -124,7 +127,7 @@ function execute() { if (!fs.existsSync(file)) { return; } - + let rawContent = readMetadata.extractMetadata(fs.readFileSync(file, "utf8")) .rawContent; @@ -135,13 +138,22 @@ function execute() { rawContent = insertTableOfContents(rawContent); } + let latestVersion; + if (ENABLE_VERSIONING) { + latestVersion = JSON.parse( + fs.readFileSync(CWD + "/versions.json", "utf8") + )[0]; + } + /* replace any links to markdown files to their website html links */ Object.keys(mdToHtml).forEach(function(key, index) { let link = mdToHtml[key]; link = link.replace("/en/", "/" + language + "/"); link = link.replace( "/VERSION/", - metadata.version ? "/" + metadata.version + "/" : "/" + metadata.version && (metadata.version !== latestVersion) + ? "/" + metadata.version + "/" + : "/" ); rawContent = rawContent.replace(new RegExp(key, "g"), link); }); diff --git a/lib/server/readMetadata.js b/lib/server/readMetadata.js index 7b7f4614b0..4c816034eb 100644 --- a/lib/server/readMetadata.js +++ b/lib/server/readMetadata.js @@ -14,7 +14,10 @@ const fs = require("fs"); const os = require("os"); const glob = require("glob"); const siteConfig = require(CWD + "/siteConfig.js"); -const versionFallback = require("./versionFallback"); +const versionFallback = require("./versionFallback.js"); + +const ENABLE_VERSIONING = fs.existsSync(CWD + "/versions.json"); + let languages; if (fs.existsSync(CWD + "/languages.js")) { languages = require(CWD + "/languages.js"); @@ -94,6 +97,7 @@ function extractMetadata(content) { return { metadata, rawContent: both.content }; } +// process the metadata for a document found in the docs folder function processMetadata(file) { const result = extractMetadata(fs.readFileSync(file, "utf8")); if (!result.metadata || !result.rawContent) { @@ -118,6 +122,18 @@ function processMetadata(file) { metadata.permalink = "docs/" + language + "/" + metadata.id + ".html"; } + if (ENABLE_VERSIONING) { + metadata.version = "next"; + if (languages.length === 1 && !siteConfig.useEnglishUrl) { + metadata.permalink = metadata.permalink.replace("docs/", "docs/next/"); + } else { + metadata.permalink = metadata.permalink.replace( + "docs/" + language + "/", + "docs/" + language + "/next/" + ); + } + } + // change ids previous, next metadata.localized_id = metadata.id; metadata.id = language + "-" + metadata.id; diff --git a/lib/server/server.js b/lib/server/server.js index 9ea89fce3a..af810e7af5 100644 --- a/lib/server/server.js +++ b/lib/server/server.js @@ -24,6 +24,7 @@ function execute(port) { const CWD = process.cwd(); const ENABLE_TRANSLATION = fs.existsSync(CWD + "/languages.js"); + const ENABLE_VERSIONING = fs.existsSync(CWD + "/versions.json"); let siteConfig = require(CWD + "/siteConfig.js"); @@ -142,10 +143,11 @@ function execute(port) { const mdToHtml = {}; Object.keys(Metadata).forEach(id => { const metadata = Metadata[id]; - if (metadata.language !== "en" || metadata.version) { + if (metadata.language !== "en" || metadata.original_id) { return; } - let htmlLink = siteConfig.baseUrl + metadata.permalink; + let htmlLink = + siteConfig.baseUrl + metadata.permalink.replace("/next/", "/"); if (htmlLink.includes("/docs/en/")) { htmlLink = htmlLink.replace("/docs/en/", "/docs/en/VERSION/"); } else { @@ -158,7 +160,7 @@ function execute(port) { const language = metadata.language; let file; - if (metadata.version) { + if (metadata.original_id) { if (ENABLE_TRANSLATION && metadata.language !== "en") { file = CWD + "/translated_docs/" + metadata.language + "/" + metadata.source; @@ -187,13 +189,22 @@ function execute(port) { rawContent = insertTableOfContents(rawContent); } + let latestVersion; + if (ENABLE_VERSIONING) { + latestVersion = JSON.parse( + fs.readFileSync(CWD + "/versions.json", "utf8") + )[0]; + } + /* replace any links to markdown files to their website html links */ Object.keys(mdToHtml).forEach(function(key, index) { let link = mdToHtml[key]; link = link.replace("/en/", "/" + language + "/"); link = link.replace( "/VERSION/", - metadata.version ? "/" + metadata.version + "/" : "/" + metadata.version && (metadata.version !== latestVersion) + ? "/" + metadata.version + "/" + : "/" ); rawContent = rawContent.replace(new RegExp(key, "g"), link); }); diff --git a/lib/server/versionFallback.js b/lib/server/versionFallback.js index a902590ac1..5d1de3253d 100644 --- a/lib/server/versionFallback.js +++ b/lib/server/versionFallback.js @@ -152,12 +152,23 @@ function diffLatestDoc(file, id) { function processVersionMetadata(file, version, useVersion, language) { const metadata = extractMetadata(fs.readFileSync(file, "utf8")).metadata; metadata.source = "version-" + useVersion + "/" + path.basename(file); + + const latestVersion = versions[0]; + if (!ENABLE_TRANSLATION && !siteConfig.useEnglishUrl) { metadata.permalink = - "docs/" + version + "/" + metadata.original_id + ".html"; + "docs/" + + (version !== latestVersion ? version + "/" : "") + + metadata.original_id + + ".html"; } else { metadata.permalink = - "docs/" + language + "/" + version + "/" + metadata.original_id + ".html"; + "docs/" + + language + + "/" + + (version !== latestVersion ? version + "/" : "") + + metadata.original_id + + ".html"; } metadata.id = metadata.id.replace( "version-" + useVersion + "-", diff --git a/lib/static/css/main.css b/lib/static/css/main.css index 06484bf7d2..2ad07d6d2a 100644 --- a/lib/static/css/main.css +++ b/lib/static/css/main.css @@ -512,6 +512,13 @@ header h2 { position: relative; z-index: 9999; } +.fixedHeaderContainer header h3 { + text-decoration: underline; + font-family: "Helvetica Neue", Arial, sans-serif; + color: white; + margin-left: 10px; + font-size: 16px; +} .promoSection { display: flex;