From abc5e325cd971fc2f6d12b0b2dd7692d5c7ffd3d Mon Sep 17 00:00:00 2001 From: Frank Li Date: Mon, 24 Jul 2017 13:33:58 -0700 Subject: [PATCH 1/8] Use information from "docSidebar.js" file instead of doc front matters for sidebars. --- examples/docSidebar.js | 10 ++++ lib/core/DocsSidebar.js | 4 +- lib/gen-doc-sidebar.js | 96 ++++++++++++++++++++++++++++++++++++ lib/server/generate.js | 10 ++-- lib/server/readCategories.js | 6 +-- lib/server/readMetadata.js | 71 ++++++++++++++++++++------ lib/server/server.js | 14 +++--- lib/write-translations.js | 10 ++-- package.json | 4 +- 9 files changed, 190 insertions(+), 35 deletions(-) create mode 100644 examples/docSidebar.js create mode 100644 lib/gen-doc-sidebar.js diff --git a/examples/docSidebar.js b/examples/docSidebar.js new file mode 100644 index 0000000000..9c96494a00 --- /dev/null +++ b/examples/docSidebar.js @@ -0,0 +1,10 @@ +module.exports = { + docs: { + Docusaurus: ["doc1"], + "First Category": ["doc2"], + "Second Category": ["doc3"] + }, + "docs-other": { + "First Category": ["doc4", "doc5"] + } +}; diff --git a/lib/core/DocsSidebar.js b/lib/core/DocsSidebar.js index 3a58f01b37..1402ee9bb9 100644 --- a/lib/core/DocsSidebar.js +++ b/lib/core/DocsSidebar.js @@ -15,8 +15,8 @@ const siteConfig = require(process.cwd() + "/siteConfig.js"); class DocsSidebar extends React.Component { render() { - let layout = this.props.metadata.layout; - let docsCategories = require("./" + layout + "Categories.js"); + let sidebar = this.props.metadata.sidebar; + let docsCategories = require("./" + sidebar + "Categories.js"); return ( { + const extension = path.extname(file); + if (extension === ".md" || extension === ".markdown") { + const metadata = extractMetadata(fs.readFileSync(file, "utf8")).metadata; + if (!metadata.id) { + return; + } + const data = {}; + data["category"] = metadata.category; + data["sidebar"] = metadata.layout; + if (metadata.next) { + data["next"] = metadata.next; + } + if (metadata.previous) { + data["previous"] = metadata.previous; + } + docs[metadata.id] = data; + } +}); + +Object.keys(docs).forEach(id => { + if (!docs[id].previous) { + sidebar[docs[id].sidebar] = {}; + sidebar[docs[id].sidebar][docs[id].category] = []; + sidebar[docs[id].sidebar][docs[id].category].push(id); + } +}); + +Object.keys(sidebar).forEach(sb => { + const categories = sidebar[sb]; + Object.keys(categories).forEach(category => { + const docIds = categories[category]; + next = docIds[0]; + while (next) { + id = next; + next = docs[id].next; + if (!next) { + return; + } + if (docs[next].category === category) { + docIds.push(next); + } else { + categories[docs[next].category] = []; + categories[docs[next].category].push(next); + } + } + }); +}); + +const str = prettier.format("module.exports = " + JSON.stringify(sidebar)); +fs.writeFileSync(process.cwd() + "/docSidebar.js", str, "utf8"); diff --git a/lib/server/generate.js b/lib/server/generate.js index f91ac75ae3..43517cfc09 100644 --- a/lib/server/generate.js +++ b/lib/server/generate.js @@ -87,12 +87,12 @@ function execute() { } const readCategories = require("./readCategories.js"); - let layouts = {}; + let sidebars = {}; for (let i = 0; i < Metadata.length; i++) { - let layout = Metadata[i].layout; - if (layouts[layout] !== true) { - layouts[layout] = true; - readCategories(layout); + let sidebar = Metadata[i].sidebar; + if (sidebars[sidebar] !== true) { + sidebars[sidebar] = true; + readCategories(sidebar); } } diff --git a/lib/server/readCategories.js b/lib/server/readCategories.js index bc56da7518..23a5427ee2 100644 --- a/lib/server/readCategories.js +++ b/lib/server/readCategories.js @@ -23,7 +23,7 @@ if (fs.existsSync(CWD + "/languages.js")) { } ]; } -function readCategories(layout) { +function readCategories(sidebar) { const enabledLanguages = []; languages.filter(lang => lang.enabled).map(lang => { enabledLanguages.push(lang.tag); @@ -35,7 +35,7 @@ function readCategories(layout) { const language = enabledLanguages[k]; const metadatas = Metadata.filter(metadata => { - return metadata.layout === layout && metadata.language === language; + return metadata.sidebar === sidebar && metadata.language === language; }); // Build a hashmap of article_id -> metadata @@ -91,7 +91,7 @@ function readCategories(layout) { } fs.writeFileSync( - __dirname + "/../core/" + layout + "Categories.js", + __dirname + "/../core/" + sidebar + "Categories.js", "/**\n" + " * @generated\n" + " */\n" + diff --git a/lib/server/readMetadata.js b/lib/server/readMetadata.js index 521f267624..9398f40609 100644 --- a/lib/server/readMetadata.js +++ b/lib/server/readMetadata.js @@ -12,6 +12,8 @@ const CWD = process.cwd(); const path = require("path"); const fs = require("fs"); const os = require("os"); +const sidebar = require(CWD + "/docSidebar.js"); +const glob = require("glob"); let languages; if (fs.existsSync(CWD + "/languages.js")) { languages = require(CWD + "/languages.js"); @@ -24,7 +26,37 @@ if (fs.existsSync(CWD + "/languages.js")) { } ]; } -const glob = require("glob"); + +function readSidebar(allSidebars) { + const order = {}; + + Object.keys(allSidebars).forEach(sidebar => { + const categories = allSidebars[sidebar]; + + let ids = []; + let categoryOrder = []; + Object.keys(categories).forEach(category => { + ids = ids.concat(categories[category]); + for (let i = 0; i < categories[category].length; i++) { + categoryOrder.push(category); + } + }); + + for (let i = 0; i < ids.length; i++) { + const id = ids[i]; + let previous, next; + if (i > 0) previous = ids[i - 1]; + if (i < ids.length - 1) next = ids[i + 1]; + order[id] = { + previous: previous, + next: next, + sidebar: sidebar, + category: categoryOrder[i] + }; + } + }); + return order; +} function splitHeader(content) { const lines = content.split(os.EOL); @@ -84,20 +116,29 @@ function processMetadata(file) { // change ids previous, next metadata.localized_id = metadata.id; metadata.id = language + "-" + metadata.id; - if (metadata.previous) { - metadata.previous_id = metadata.previous; - metadata.previous = language + "-" + metadata.previous; - } - if (metadata.next) { - metadata.next_id = metadata.next; - metadata.next = language + "-" + metadata.next; - } metadata.language = language; + const order = readSidebar(sidebar); + const id = metadata.localized_id; + + metadata.sidebar = order[id].sidebar; + metadata.category = order[id].category; + + if (order[id].next) { + metadata.next_id = order[id].next; + metadata.next = language + "-" + order[id].next; + } + if (order[id].previous) { + metadata.previous_id = order[id].previous; + metadata.previous = language + "-" + order[id].previous; + } + return { metadata, rawContent: rawContent }; } function generateDocsMetadata() { + const order = readSidebar(sidebar); + const regexSubFolder = /docs\/(.*)\/.*/; const enabledLanguages = []; @@ -126,7 +167,7 @@ function generateDocsMetadata() { if (!res) { return; } - const metadata = res.metadata; + let metadata = res.metadata; metadatas.push(metadata); } }); @@ -181,7 +222,9 @@ function generateBlogMetadata() { ); } -module.exports.extractMetadata = extractMetadata; -module.exports.processMetadata = processMetadata; -module.exports.generateDocsMetadata = generateDocsMetadata; -module.exports.generateBlogMetadata = generateBlogMetadata; +module.exports = { + extractMetadata, + processMetadata, + generateDocsMetadata, + generateBlogMetadata +}; diff --git a/lib/server/server.js b/lib/server/server.js index 510e8cbc3d..c3974af4fc 100644 --- a/lib/server/server.js +++ b/lib/server/server.js @@ -17,7 +17,6 @@ function execute(port) { const fs = require("fs-extra"); const os = require("os"); const path = require("path"); - const readMetadata = require("./readMetadata.js"); const toSlug = require("../core/toSlug.js"); const mkdirp = require("mkdirp"); const glob = require("glob"); @@ -70,22 +69,25 @@ function execute(port) { /****************************************************************************/ + let readMetadata; let Metadata; let readCategories; function reloadMetadataCategories() { + purgeCache("./readMetadata.js"); + readMetadata = require("./readMetadata.js"); readMetadata.generateDocsMetadata(); purgeCache("../core/metadata.js"); Metadata = require("../core/metadata.js"); purgeCache("./readCategories.js"); readCategories = require("./readCategories.js"); - let layouts = {}; + let sidebars = {}; for (let i = 0; i < Metadata.length; i++) { - let layout = Metadata[i].layout; - if (layouts[layout] !== true) { - layouts[layout] = true; - readCategories(layout); + let sidebar = Metadata[i].sidebar; + if (sidebars[sidebar] !== true) { + sidebars[sidebar] = true; + readCategories(sidebar); } } } diff --git a/lib/write-translations.js b/lib/write-translations.js index 4bd7e711a1..610850e557 100644 --- a/lib/write-translations.js +++ b/lib/write-translations.js @@ -41,11 +41,13 @@ function execute() { files.forEach(file => { const extension = path.extname(file); if (extension === ".md" || extension === ".markdown") { - const metadata = readMetadata.extractMetadata( - fs.readFileSync(file, "utf8") - ).metadata; + const res = readMetadata.processMetadata(file); + if (!res) { + return + } + const metadata = res.metadata; - translations["localized-strings"][metadata.id] = metadata.title; + translations["localized-strings"][metadata.localized_id] = metadata.title; translations["localized-strings"][metadata.category] = metadata.category; if (metadata.sidebar_title) { diff --git a/package.json b/package.json index 79b0bcbb04..aa921b5db8 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "express": "^4.15.3", "fs-extra": "^3.0.1", "glob": "^7.1.2", + "prettier": "^1.5.3", "react": "^15.5.4", "react-dom": "^15.5.4", "request": "^2.81.0", @@ -27,6 +28,7 @@ "docusaurus-build": "./lib/build-files.js", "docusaurus-publish": "./lib/publish-gh-pages.js", "docusaurus-examples": "./lib/copy-examples.js", - "docusaurus-write-translations": "./lib/write-translations.js" + "docusaurus-write-translations": "./lib/write-translations.js", + "docusaurus-gen-doc-sidebar": "./lib/gen-doc-sidebar.js" } } From 4c0b9e807e6ee166faca285e52abe9fa9b697881 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Fri, 28 Jul 2017 09:40:46 -0700 Subject: [PATCH 2/8] Publish Prism changes to npm --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 79b0bcbb04..a9e4ee07e3 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "shelljs": "^0.7.8" }, "name": "docusaurus", - "version": "1.0.0-alpha.29", + "version": "1.0.0-alpha.30", "bin": { "docusaurus-start": "./lib/start-server.js", "docusaurus-build": "./lib/build-files.js", From 0917de00900af14814ecb46948dd2b168d1c92cb Mon Sep 17 00:00:00 2001 From: Frank Li Date: Fri, 28 Jul 2017 10:31:08 -0700 Subject: [PATCH 3/8] Fix header image link --- lib/static/css/main.css | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/static/css/main.css b/lib/static/css/main.css index 301fdf8607..06484bf7d2 100644 --- a/lib/static/css/main.css +++ b/lib/static/css/main.css @@ -492,6 +492,7 @@ header h2 { display: flex; flex-flow: row nowrap; height: 34px; + z-index: 10000; } .fixedHeaderContainer header { display: flex; diff --git a/package.json b/package.json index a9e4ee07e3..dd0a778e2e 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "shelljs": "^0.7.8" }, "name": "docusaurus", - "version": "1.0.0-alpha.30", + "version": "1.0.0-alpha.31", "bin": { "docusaurus-start": "./lib/start-server.js", "docusaurus-build": "./lib/build-files.js", From dfeaac74ccb264e4fd6b3e49681a6d046f6f6513 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Fri, 28 Jul 2017 10:56:24 -0700 Subject: [PATCH 4/8] Publish changes to npm --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dd0a778e2e..fbcafc1f98 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "shelljs": "^0.7.8" }, "name": "docusaurus", - "version": "1.0.0-alpha.31", + "version": "1.0.0-alpha.32", "bin": { "docusaurus-start": "./lib/start-server.js", "docusaurus-build": "./lib/build-files.js", From 419e0c0ff90df831cda7b75847e1a8a2d71d7f20 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Mon, 31 Jul 2017 16:19:02 -0700 Subject: [PATCH 5/8] Initial API refactor --- examples/{docSidebar.js => sidebar.json} | 8 +- lib/gen-doc-sidebar.js | 96 ------------- lib/publish-gh-pages.js | 3 +- lib/server/generate.js | 164 ++++++++++++++--------- lib/server/readMetadata.js | 44 ++++-- lib/server/server.js | 52 +++++-- lib/write-translations.js | 19 ++- package.json | 3 +- 8 files changed, 196 insertions(+), 193 deletions(-) rename examples/{docSidebar.js => sidebar.json} (69%) delete mode 100644 lib/gen-doc-sidebar.js diff --git a/examples/docSidebar.js b/examples/sidebar.json similarity index 69% rename from examples/docSidebar.js rename to examples/sidebar.json index 9c96494a00..7a1d054018 100644 --- a/examples/docSidebar.js +++ b/examples/sidebar.json @@ -1,10 +1,10 @@ -module.exports = { - docs: { - Docusaurus: ["doc1"], +{ + "docs": { + "Docusaurus": ["doc1"], "First Category": ["doc2"], "Second Category": ["doc3"] }, "docs-other": { "First Category": ["doc4", "doc5"] } -}; +} diff --git a/lib/gen-doc-sidebar.js b/lib/gen-doc-sidebar.js deleted file mode 100644 index 0490322c5c..0000000000 --- a/lib/gen-doc-sidebar.js +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env node - -/* script to generate docSidebar.js file for users who are using - doc front mattters with category, layout, previous, and next fields */ -const glob = require("glob"); -const fs = require("fs"); -const path = require("path"); -const prettier = require("prettier"); - -function splitHeader(content) { - const lines = content.split("\n"); - let i = 1; - for (; i < lines.length - 1; ++i) { - if (lines[i] === "---") { - break; - } - } - return { - header: lines.slice(1, i + 1).join("\n"), - content: lines.slice(i + 1).join("\n") - }; -} - -// Extract markdown metadata header -function extractMetadata(content) { - const metadata = {}; - const both = splitHeader(content); - const lines = both.header.split("\n"); - for (let i = 0; i < lines.length - 1; ++i) { - const keyvalue = lines[i].split(":"); - const key = keyvalue[0].trim(); - let value = keyvalue.slice(1).join(":").trim(); - // Handle the case where you have "Community #10" - try { - value = JSON.parse(value); - } catch (e) {} - metadata[key] = value; - } - return { metadata, rawContent: both.content }; -} - -const docs = {}; -const sidebar = {}; - -const files = glob.sync(process.cwd() + "/../docs/**"); -files.forEach(file => { - const extension = path.extname(file); - if (extension === ".md" || extension === ".markdown") { - const metadata = extractMetadata(fs.readFileSync(file, "utf8")).metadata; - if (!metadata.id) { - return; - } - const data = {}; - data["category"] = metadata.category; - data["sidebar"] = metadata.layout; - if (metadata.next) { - data["next"] = metadata.next; - } - if (metadata.previous) { - data["previous"] = metadata.previous; - } - docs[metadata.id] = data; - } -}); - -Object.keys(docs).forEach(id => { - if (!docs[id].previous) { - sidebar[docs[id].sidebar] = {}; - sidebar[docs[id].sidebar][docs[id].category] = []; - sidebar[docs[id].sidebar][docs[id].category].push(id); - } -}); - -Object.keys(sidebar).forEach(sb => { - const categories = sidebar[sb]; - Object.keys(categories).forEach(category => { - const docIds = categories[category]; - next = docIds[0]; - while (next) { - id = next; - next = docs[id].next; - if (!next) { - return; - } - if (docs[next].category === category) { - docIds.push(next); - } else { - categories[docs[next].category] = []; - categories[docs[next].category].push(next); - } - } - }); -}); - -const str = prettier.format("module.exports = " + JSON.stringify(sidebar)); -fs.writeFileSync(process.cwd() + "/docSidebar.js", str, "utf8"); diff --git a/lib/publish-gh-pages.js b/lib/publish-gh-pages.js index 87c66d34b3..bd4604350c 100644 --- a/lib/publish-gh-pages.js +++ b/lib/publish-gh-pages.js @@ -33,8 +33,7 @@ if (shell.exec("docusaurus-build").code) { shell.exit(1); } -shell.cd(__dirname); -shell.cd(".."); +shell.cd(process.cwd()); shell.cd("build"); if ( diff --git a/lib/server/generate.js b/lib/server/generate.js index 6d78c0b0d3..aa8cd01b12 100644 --- a/lib/server/generate.js +++ b/lib/server/generate.js @@ -70,7 +70,7 @@ function execute() { console.log("generate.js triggered..."); - const regexSubFolder = /docs\/(.*)\/.*/; + const regexSubFolder = /translated_docs\/(.*)\/.*/; const enabledLanguages = []; languages.filter(lang => lang.enabled).map(lang => { @@ -82,27 +82,21 @@ function execute() { let mdToHtml = {}; for (let i = 0; i < Metadata.length; i++) { const metadata = Metadata[i]; - mdToHtml["/docs/" + metadata.language + "/" + metadata.source] = - "/" + siteConfig.projectName + "/" + metadata.permalink; + if (metadata.language !== "en") { + continue; + } + mdToHtml[metadata.source] = siteConfig.baseUrl + metadata.permalink; } const DocsLayout = require("../core/DocsLayout.js"); - fs.removeSync(__dirname + "/../../build"); + fs.removeSync(CWD + "/build"); - // create html files for all docs + // create html files for all English docs let files = glob.sync(CWD + "/../docs/**"); files.forEach(file => { // console.log(file); let language = "en"; - const match = regexSubFolder.exec(file); - if (match) { - language = match[1]; - } - - if (enabledLanguages.indexOf(language) === -1) { - return; - } const extension = path.extname(file); @@ -120,6 +114,61 @@ function execute() { rawContent = insertTableOfContents(rawContent); } + /* replace any links to markdown files to their website html links */ + Object.keys(mdToHtml).forEach(function(key, index) { + rawContent = rawContent.replace( + new RegExp(key, "g"), + mdToHtml[key].replace("/en/", "/" + language + "/") + ); + }); + + const docComp = ( + + {rawContent} + + ); + const str = renderToStaticMarkup(docComp); + + let targetFile = + CWD + "/build/" + siteConfig.projectName + "/" + metadata.permalink; + // console.log(targetFile); + writeFileAndCreateFolder(targetFile, str); + } + }); + + // create html files for all non-English docs + if (languages.length > 1) { + files = glob.sync(CWD + "/translated_docs/**"); + files.forEach(file => { + let language = "en"; + + const match = regexSubFolder.exec(file); + if (match) { + language = match[1]; + } + + if (enabledLanguages.indexOf(language) === -1) { + return; + } + + const extension = path.extname(file); + if (extension !== ".md" && extension !== ".markdown") { + return; + } + + const result = readMetadata.processMetadata(file); + if (!result) { + return; + } + + const metadata = result.metadata; + let rawContent = result.rawContent; + + /* generate table of contents if appropriate */ + if (rawContent && rawContent.indexOf(TABLE_OF_CONTENTS_TOKEN) != -1) { + rawContent = insertTableOfContents(rawContent); + } + /* replace any links to markdown files to their website html links */ Object.keys(mdToHtml).forEach(function(key, index) { rawContent = rawContent.replace(new RegExp(key, "g"), mdToHtml[key]); @@ -131,18 +180,20 @@ function execute() { ); const str = renderToStaticMarkup(docComp); - let targetFile = - __dirname + - "/../../build" + - "/" + - siteConfig.projectName + - "/" + - metadata.permalink; + CWD + "/build/" + siteConfig.projectName + "/" + metadata.permalink; // console.log(targetFile); writeFileAndCreateFolder(targetFile, str); - } - }); + }); + } + + /* copy docs assets if they exist */ + if (fs.existsSync(CWD + "/../docs/assets")) { + fs.copySync( + CWD + "/../docs/assets", + CWD + "/build/" + siteConfig.projectName + "/docs/assets" + ); + } // create html files for all blog posts if (fs.existsSync(__dirname + "../core/MetadataBlog.js")) { @@ -152,8 +203,13 @@ function execute() { const MetadataBlog = require("../core/MetadataBlog.js"); const BlogPostLayout = require("../core/BlogPostLayout.js"); - files = glob.sync(CWD + "/../blog/**/*.*"); + files = glob.sync(CWD + "/blog/**/*.*"); files.sort().reverse().forEach(file => { + const extension = path.extname(file); + if (extension !== ".md" && extension !== ".markdown") { + return; + } + /* convert filename ot use slashes */ const filePath = path .basename(file) @@ -185,13 +241,7 @@ function execute() { const str = renderToStaticMarkup(blogPostComp); let targetFile = - __dirname + - "/../../build" + - "/" + - siteConfig.projectName + - "/" + - "blog/" + - filePath; + CWD + "/build/" + siteConfig.projectName + "/blog/" + filePath; writeFileAndCreateFolder(targetFile, str); }); // create html files for all blog pages @@ -210,25 +260,32 @@ function execute() { const str = renderToStaticMarkup(blogPageComp); let targetFile = - __dirname + - "/../../build" + - "/" + + CWD + + "/build/" + siteConfig.projectName + - "/" + - "blog" + + "/blog" + (page > 0 ? "/page" + (page + 1) : "") + "/index.html"; writeFileAndCreateFolder(targetFile, str); } + /* copy blog assets if they exist */ + if (fs.existsSync(CWD + "/blog/assets")) { + fs.copySync( + CWD + "/blog/assets", + CWD + "/build/" + siteConfig.projectName + "/blog/assets" + ); + } + /* copy all static files from docusaurus */ files = glob.sync(__dirname + "/../static/**"); files.forEach(file => { - let targetFile = file.replace( - "/lib/static/", - "/build" + "/" + siteConfig.projectName + "/" - ); - + let targetFile = + CWD + + "/build/" + + siteConfig.projectName + + "/" + + file.split("/static/")[1]; if (file.match(/\.css$/)) { let cssContent = fs.readFileSync(file); cssContent = cssContent @@ -259,12 +316,7 @@ function execute() { files.forEach(file => { if (file.match(/\.css$/) && !isSeparateCss(file)) { const mainCss = - __dirname + - "/../../build" + - "/" + - siteConfig.projectName + - "/" + - "css/main.css"; + CWD + "/build/" + siteConfig.projectName + "/css/main.css"; let cssContent = fs.readFileSync(file); cssContent = fs.readFileSync(mainCss) + "\n" + cssContent; @@ -287,12 +339,7 @@ function execute() { } else if (!fs.lstatSync(file).isDirectory()) { let parts = file.split("static"); let targetFile = - __dirname + - "/../../build" + - "/" + - siteConfig.projectName + - "/" + - parts[1]; + CWD + "/build/" + siteConfig.projectName + "/" + parts[1]; mkdirp.sync(targetFile.replace(new RegExp("/[^/]*$"), "")); fs.copySync(file, targetFile); } @@ -315,7 +362,7 @@ function execute() { const ReactComp = require(tempFile); let targetFile = - __dirname + "/../../build/" + siteConfig.projectName + "/" + parts[1]; + CWD + "/build/" + siteConfig.projectName + "/" + parts[1]; targetFile = targetFile.replace(/\.js$/, ".html"); const regexLang = /\/pages\/(.*)\//; @@ -364,21 +411,14 @@ function execute() { } else if (!fs.lstatSync(file).isDirectory()) { let parts = file.split("pages"); let targetFile = - __dirname + - "/../../build" + - "/" + - siteConfig.projectName + - "/" + - parts[1]; + CWD + "/build/" + siteConfig.projectName + "/" + parts[1]; mkdirp.sync(targetFile.replace(new RegExp("/[^/]*$"), "")); fs.copySync(file, targetFile); } }); /* copy html files in 'en' to base level as well */ - files = glob.sync( - __dirname + "/../../build" + "/" + siteConfig.projectName + "/" + "en/**" - ); + files = glob.sync(CWD + "/build/" + siteConfig.projectName + "/en/**"); files.forEach(file => { let targetFile = file.replace("en/", ""); if (file.match(/\.html$/)) { diff --git a/lib/server/readMetadata.js b/lib/server/readMetadata.js index 9398f40609..dc8584428e 100644 --- a/lib/server/readMetadata.js +++ b/lib/server/readMetadata.js @@ -12,8 +12,9 @@ const CWD = process.cwd(); const path = require("path"); const fs = require("fs"); const os = require("os"); -const sidebar = require(CWD + "/docSidebar.js"); +const sidebar = require(CWD + "/sidebar.json"); const glob = require("glob"); +const siteConfig = require(CWD + "/siteConfig.js"); let languages; if (fs.existsSync(CWD + "/languages.js")) { languages = require(CWD + "/languages.js"); @@ -108,11 +109,12 @@ function processMetadata(file) { const rawContent = result.rawContent; metadata.source = path.basename(file); - // in permalink replace /en/ language with localized folder - metadata.permalink = metadata.permalink.replace( - /\/en\//g, - "/" + language + "/" - ); + if (languages.length === 1 && !siteConfig.useEnglishUrl) { + metadata.permalink = "docs/" + metadata.id + ".html"; + } else { + metadata.permalink = "docs/" + language + "/" + metadata.id + ".html"; + } + // change ids previous, next metadata.localized_id = metadata.id; metadata.id = language + "-" + metadata.id; @@ -139,7 +141,7 @@ function processMetadata(file) { function generateDocsMetadata() { const order = readSidebar(sidebar); - const regexSubFolder = /docs\/(.*)\/.*/; + const regexSubFolder = /translated_docs\/(.*)\/.*/; const enabledLanguages = []; languages.filter(lang => lang.enabled).map(lang => { @@ -148,7 +150,25 @@ function generateDocsMetadata() { const metadatas = []; - const files = glob.sync(CWD + "/../docs/**"); + /* metadata for english files */ + let files = glob.sync(CWD + "/../docs/**"); + files.forEach(file => { + let language = "en"; + + const extension = path.extname(file); + + if (extension === ".md" || extension === ".markdown") { + const res = processMetadata(file); + if (!res) { + return; + } + let metadata = res.metadata; + metadatas.push(metadata); + } + }); + + /* metadata for non-english docs */ + files = glob.sync(CWD + "/translated_docs/**"); files.forEach(file => { let language = "en"; const match = regexSubFolder.exec(file); @@ -186,8 +206,12 @@ function generateDocsMetadata() { function generateBlogMetadata() { const metadatas = []; - let files = glob.sync(CWD + "/../blog/**/*.*"); + let files = glob.sync(CWD + "/blog/**/*.*"); files.sort().reverse().forEach(file => { + const extension = path.extname(file); + if (extension !== ".md" && extension !== ".markdown") { + return; + } // Transform // 2015-08-13-blog-post-name-0.5.md // into @@ -197,8 +221,6 @@ function generateBlogMetadata() { .replace("-", "/") .replace("-", "/") .replace("-", "/") - // react-middleware is broken with files that contains multiple . - // like react-0.14.js .replace(/\./g, "-") .replace(/\-md$/, ".html"); const result = extractMetadata(fs.readFileSync(file, { encoding: "utf8" })); diff --git a/lib/server/server.js b/lib/server/server.js index f5297fbbb9..3f857ac18c 100644 --- a/lib/server/server.js +++ b/lib/server/server.js @@ -22,6 +22,7 @@ function execute(port) { const glob = require("glob"); const translate = require("./translate.js"); let siteConfig = require(CWD + "/siteConfig.js"); + const ENABLE_TRANSLATION = fs.existsSync(CWD + "/languages.js"); /** * Removes a module from the cache @@ -78,7 +79,6 @@ function execute(port) { readMetadata.generateDocsMetadata(); purgeCache("../core/metadata.js"); Metadata = require("../core/metadata.js"); - } /****************************************************************************/ @@ -121,7 +121,7 @@ function execute(port) { reloadMetadata(); /* handle all requests for document pages */ - const app = express().get(/docs\/[\s\S]*html$/, (req, res, next) => { + const app = express().get(/docs\/.*html$/, (req, res, next) => { purgeCache(CWD + "/siteConfig.js"); siteConfig = require(CWD + "/siteConfig.js"); @@ -131,23 +131,29 @@ function execute(port) { let links = {}; for (let i = 0; i < Metadata.length; i++) { const metadata = Metadata[i]; - links[metadata.permalink] = - "docs/" + metadata.language + "/" + metadata.source; + if (metadata.language === "en") { + links[metadata.permalink] = CWD + "/../docs/" + metadata.source; + } else { + links[metadata.permalink] = + CWD + "/translated_docs/" + metadata.language + "/" + metadata.source; + } } let mdToHtml = {}; for (let i = 0; i < Metadata.length; i++) { const metadata = Metadata[i]; - mdToHtml["/docs/" + metadata.language + "/" + metadata.source] = - siteConfig.baseUrl + metadata.permalink; + if (metadata.language !== "en") { + continue; + } + mdToHtml[metadata.source] = siteConfig.baseUrl + metadata.permalink; } + console.log(mdToHtml); let file = links[req.path.toString().replace(siteConfig.baseUrl, "")]; - file = CWD + "/../" + file; + console.log(file); if (!fs.existsSync(file)) { next(); return; } - console.log(file); const result = readMetadata.processMetadata(file); const metadata = result.metadata; @@ -161,9 +167,17 @@ function execute(port) { /* replace any links to markdown files to their website html links */ Object.keys(mdToHtml).forEach(function(key, index) { - rawContent = rawContent.replace(new RegExp(key, "g"), mdToHtml[key]); + rawContent = rawContent.replace( + new RegExp(key, "g"), + mdToHtml[key].replace("/en/", "/" + language + "/") + ); }); + rawContent = rawContent.replace( + /\]\(assets\//g, + "](" + siteConfig.baseUrl + "docs/assets/" + ); + purgeCache("../core/DocsLayout.js"); const DocsLayout = require("../core/DocsLayout.js"); const docComp = ( @@ -175,7 +189,9 @@ function execute(port) { res.send(renderToStaticMarkup(docComp)); }); /* handle all requests for blog pages and posts */ - app.get(/blog\/[\s\S]*html$/, (req, res) => { + app.get(/blog\/.*html$/, (req, res) => { + console.log(req.path); + purgeCache(CWD + "/siteConfig.js"); siteConfig = require(CWD + "/siteConfig.js"); @@ -229,12 +245,16 @@ function execute(port) { let file = parts[1]; file = file.replace(/\.html$/, ".md"); file = file.replace(new RegExp("/", "g"), "-"); - file = CWD + "/../blog/" + file; + file = CWD + "/blog/" + file; const result = readMetadata.extractMetadata( fs.readFileSync(file, { encoding: "utf8" }) ); - const rawContent = result.rawContent; + let rawContent = result.rawContent; + rawContent = rawContent.replace( + /\]\(assets\//g, + "](" + siteConfig.baseUrl + "blog/assets/" + ); const metadata = Object.assign( { path: req.path.toString().split("blog/")[1], content: rawContent }, result.metadata @@ -385,6 +405,14 @@ function execute(port) { }); /* serve static content first from user folder then from docusaurus */ + app.use( + siteConfig.baseUrl + "docs/assets/", + express.static(CWD + "/../docs/assets") + ); + app.use( + siteConfig.baseUrl + "blog/assets/", + express.static(CWD + "/blog/assets") + ); app.use(siteConfig.baseUrl, express.static(CWD + "/static")); app.use(siteConfig.baseUrl, express.static(__dirname + "/../static")); diff --git a/lib/write-translations.js b/lib/write-translations.js index 610850e557..24c46f1514 100644 --- a/lib/write-translations.js +++ b/lib/write-translations.js @@ -20,6 +20,7 @@ const path = require("path"); const siteConfig = require(CWD + "/siteConfig.js"); const babylon = require("babylon"); const traverse = require("babel-traverse").default; +const sidebar = require(CWD + "/sidebar.json"); function writeFileAndCreateFolder(file, content) { mkdirp.sync(file.replace(new RegExp("/[^/]*$"), "")); @@ -37,18 +38,17 @@ function execute() { }; /* look through front matter of docs for titles and categories to translate */ - let files = glob.sync(CWD + "/../docs/en/**"); + let files = glob.sync(CWD + "/../docs/**"); files.forEach(file => { const extension = path.extname(file); if (extension === ".md" || extension === ".markdown") { const res = readMetadata.processMetadata(file); if (!res) { - return + return; } const metadata = res.metadata; translations["localized-strings"][metadata.localized_id] = metadata.title; - translations["localized-strings"][metadata.category] = metadata.category; if (metadata.sidebar_title) { translations["localized-strings"][metadata.sidebar_title] = @@ -66,6 +66,14 @@ function execute() { siteConfig.headerLinksExternal[i].text; } + /* find sidebar category titles to translate */ + Object.keys(sidebar).forEach(sb => { + const categories = sidebar[sb]; + Object.keys(categories).forEach(category => { + translations["localized-strings"][category] = category; + }); + }); + /* go through pages to look for text inside translate tags */ files = glob.sync(CWD + "/pages/en/**"); files.forEach(file => { @@ -96,7 +104,10 @@ function execute() { }); } }); - writeFileAndCreateFolder(CWD + "/i18n/en.json", JSON.stringify(translations)); + writeFileAndCreateFolder( + CWD + "/i18n/en.json", + JSON.stringify(translations, null, 2) + ); } execute(); diff --git a/package.json b/package.json index ae771ccdfc..8db15774f5 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "docusaurus-build": "./lib/build-files.js", "docusaurus-publish": "./lib/publish-gh-pages.js", "docusaurus-examples": "./lib/copy-examples.js", - "docusaurus-write-translations": "./lib/write-translations.js", - "docusaurus-gen-doc-sidebar": "./lib/gen-doc-sidebar.js" + "docusaurus-write-translations": "./lib/write-translations.js" } } From 9e700554523fd62f913a563f6773f87d0122e6f0 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Tue, 1 Aug 2017 15:56:50 -0700 Subject: [PATCH 6/8] Add siteConfig option for Open Graph image --- lib/core/Head.js | 6 +++++- package.json | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/core/Head.js b/lib/core/Head.js index 1860b83863..fed2b70911 100644 --- a/lib/core/Head.js +++ b/lib/core/Head.js @@ -37,7 +37,11 @@ class Head extends React.Component { - + {this.props.ogImage && + } Date: Tue, 1 Aug 2017 15:58:05 -0700 Subject: [PATCH 7/8] Fix Open Graph image option --- lib/core/Head.js | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/core/Head.js b/lib/core/Head.js index fed2b70911..034bc00610 100644 --- a/lib/core/Head.js +++ b/lib/core/Head.js @@ -37,10 +37,10 @@ class Head extends React.Component { - {this.props.ogImage && + {this.props.config.ogImage && } Date: Wed, 2 Aug 2017 15:13:10 -0700 Subject: [PATCH 8/8] Clean up API changes --- lib/server/generate.js | 3 +-- lib/server/readMetadata.js | 8 ++++---- lib/server/server.js | 16 +++++----------- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/lib/server/generate.js b/lib/server/generate.js index aa8cd01b12..16965dcc54 100644 --- a/lib/server/generate.js +++ b/lib/server/generate.js @@ -70,8 +70,6 @@ function execute() { console.log("generate.js triggered..."); - const regexSubFolder = /translated_docs\/(.*)\/.*/; - const enabledLanguages = []; languages.filter(lang => lang.enabled).map(lang => { enabledLanguages.push(lang.tag); @@ -142,6 +140,7 @@ function execute() { files.forEach(file => { let language = "en"; + const regexSubFolder = /translated_docs\/(.*)\/.*/; const match = regexSubFolder.exec(file); if (match) { language = match[1]; diff --git a/lib/server/readMetadata.js b/lib/server/readMetadata.js index dc8584428e..efc31d8f65 100644 --- a/lib/server/readMetadata.js +++ b/lib/server/readMetadata.js @@ -12,7 +12,6 @@ const CWD = process.cwd(); const path = require("path"); const fs = require("fs"); const os = require("os"); -const sidebar = require(CWD + "/sidebar.json"); const glob = require("glob"); const siteConfig = require(CWD + "/siteConfig.js"); let languages; @@ -28,7 +27,8 @@ if (fs.existsSync(CWD + "/languages.js")) { ]; } -function readSidebar(allSidebars) { +function readSidebar() { + const allSidebars = require(CWD + "/sidebar.json"); const order = {}; Object.keys(allSidebars).forEach(sidebar => { @@ -120,7 +120,7 @@ function processMetadata(file) { metadata.id = language + "-" + metadata.id; metadata.language = language; - const order = readSidebar(sidebar); + const order = readSidebar(); const id = metadata.localized_id; metadata.sidebar = order[id].sidebar; @@ -139,7 +139,7 @@ function processMetadata(file) { } function generateDocsMetadata() { - const order = readSidebar(sidebar); + const order = readSidebar(); const regexSubFolder = /translated_docs\/(.*)\/.*/; diff --git a/lib/server/server.js b/lib/server/server.js index 3f857ac18c..85a62e5048 100644 --- a/lib/server/server.js +++ b/lib/server/server.js @@ -9,7 +9,6 @@ function execute(port) { const translation = require("./translation.js"); - const CWD = process.cwd(); const express = require("express"); const React = require("react"); const request = require("request"); @@ -21,9 +20,12 @@ function execute(port) { const mkdirp = require("mkdirp"); const glob = require("glob"); const translate = require("./translate.js"); - let siteConfig = require(CWD + "/siteConfig.js"); + + const CWD = process.cwd(); const ENABLE_TRANSLATION = fs.existsSync(CWD + "/languages.js"); + let siteConfig = require(CWD + "/siteConfig.js"); + /** * Removes a module from the cache */ @@ -125,8 +127,6 @@ function execute(port) { purgeCache(CWD + "/siteConfig.js"); siteConfig = require(CWD + "/siteConfig.js"); - console.log(req.path); - reloadMetadata(); let links = {}; for (let i = 0; i < Metadata.length; i++) { @@ -146,10 +146,9 @@ function execute(port) { } mdToHtml[metadata.source] = siteConfig.baseUrl + metadata.permalink; } - console.log(mdToHtml); let file = links[req.path.toString().replace(siteConfig.baseUrl, "")]; - console.log(file); + if (!fs.existsSync(file)) { next(); return; @@ -190,8 +189,6 @@ function execute(port) { }); /* handle all requests for blog pages and posts */ app.get(/blog\/.*html$/, (req, res) => { - console.log(req.path); - purgeCache(CWD + "/siteConfig.js"); siteConfig = require(CWD + "/siteConfig.js"); @@ -283,8 +280,6 @@ function execute(port) { purgeCache(CWD + "/siteConfig.js"); siteConfig = require(CWD + "/siteConfig.js"); - console.log(req.path); - /* look for user provided html file first */ let htmlFile = req.path.toString().replace(siteConfig.baseUrl, ""); htmlFile = CWD + "/pages/" + htmlFile; @@ -362,7 +357,6 @@ function execute(port) { res.send(str); } else { - console.log(req.path); next(); return; }