Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixing Issue 305 - broken links because of language #316

Merged
merged 10 commits into from
Dec 19, 2017
39 changes: 14 additions & 25 deletions examples/basics/core/Footer.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@
const React = require('react');

class Footer extends React.Component {
docUrl(doc, language) {
const baseUrl = this.props.config.baseUrl;
return baseUrl + 'docs/' + (language ? language + '/' : '') + doc;
}

pageUrl(doc, language) {
const baseUrl = this.props.config.baseUrl;
return baseUrl + (language ? language + '/' : '') + doc;
}

render() {
const currentYear = new Date().getFullYear();
return (
Expand All @@ -25,40 +35,19 @@ class Footer extends React.Component {
</a>
<div>
<h5>Docs</h5>
<a
href={
this.props.config.baseUrl +
'docs/' +
this.props.language +
'/doc1.html'
}>
<a href={this.docUrl('doc1.html', this.props.language)}>
Getting Started (or other categories)
</a>
<a
href={
this.props.config.baseUrl +
'docs/' +
this.props.language +
'/doc2.html'
}>
<a href={this.docUrl('doc2.html', this.props.language)}>
Guides (or other categories)
</a>
<a
href={
this.props.config.baseUrl +
'docs/' +
this.props.language +
'/doc3.html'
}>
<a href={this.docUrl('doc3.html', this.props.language)}>
API Reference (or other categories)
</a>
</div>
<div>
<h5>Community</h5>
<a
href={
this.props.config.baseUrl + this.props.language + '/users.html'
}>
<a href={this.pageUrl('users.html', this.props.language)}>
User Showcase
</a>
<a
Expand Down
6 changes: 3 additions & 3 deletions examples/basics/pages/en/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ function imgUrl(img) {
}

function docUrl(doc, language) {
return siteConfig.baseUrl + 'docs/' + language + '/' + doc;
return siteConfig.baseUrl + 'docs/' + (language ? language + '/' : '') + doc;
}

function pageUrl(page, language) {
return siteConfig.baseUrl + language + '/' + page;
return siteConfig.baseUrl + (language ? language + '/' : '') + page;
}

class Button extends React.Component {
Expand Down Expand Up @@ -73,7 +73,7 @@ const PromoSection = props => (

class HomeSplash extends React.Component {
render() {
let language = this.props.language || 'en';
let language = this.props.language || '';
return (
<SplashContainer>
<Logo img_src={imgUrl('docusaurus.svg')} />
Expand Down
58 changes: 26 additions & 32 deletions lib/core/nav/HeaderNav.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,43 +11,36 @@ const React = require('react');
const fs = require('fs');
const siteConfig = require(CWD + '/siteConfig.js');
const translation = require('../../server/translation.js');
const env = require('../../server/env.js');

const translate = require('../../server/translate.js').translate;
const setLanguage = require('../../server/translate.js').setLanguage;

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');
}
const readMetadata = require('../../server/readMetadata.js');
readMetadata.generateMetadataDocs();
const Metadata = require('../metadata.js');

// language dropdown nav item for when translations are enabled
class LanguageDropDown extends React.Component {
render() {
const enabledLanguages = [];
if (!env.translation.enabled) {
return null;
}

let currentLanguage = 'English';
setLanguage(this.props.language);
let helpTranslateString = translate(
'Help Translate|recruit community translators for your project'
);
// add all enabled languages to dropdown
translation['languages'].map(lang => {
if (lang.tag == this.props.language) {
currentLanguage = lang.name;
}
if (lang.tag == this.props.language) {
return;
}
enabledLanguages.push(
const enabledLanguages = env.translation
.enabledLanguages()
.filter(lang => lang !== this.props.language)
.map(lang => (
<li key={lang.tag}>
<a href={siteConfig.baseUrl + lang.tag}>{lang.name}</a>
</li>
);
});
));
// if no languages are enabled besides English, return null
if (enabledLanguages.length < 1) {
return null;
Expand Down Expand Up @@ -126,17 +119,14 @@ class HeaderNav extends React.Component {
);
} else if (link.doc) {
// set link to document with current page's language/version
let id;
if (!ENABLE_VERSIONING || this.props.version === 'next') {
id = this.props.language + '-' + link.doc;
} else {
id =
this.props.language +
'-version-' +
(this.props.version || versions[0]) +
'-' +
link.doc;
}
const langPart = env.translation.enabled ? this.props.language + '-' : '';
const versionPart =
env.translation.enabled && this.props.version !== 'next'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be env.versioning.enabled, not env.translation.enabled.

? '-version-' +
(this.props.version || env.versioning.latestVersion) +
'-'
: '';
const id = langPart + versionPart + link.doc;
if (!Metadata[id]) {
if (id != link.doc) {
throw new Error(
Expand All @@ -153,9 +143,13 @@ class HeaderNav extends React.Component {
href = this.props.config.baseUrl + Metadata[id].permalink;
} else if (link.page) {
// set link to page with current page's language if appropriate
const language = this.props.language || '';
if (fs.existsSync(CWD + '/pages/en/' + link.page + '.js')) {
href =
siteConfig.baseUrl + this.props.language + '/' + link.page + '.html';
siteConfig.baseUrl +
(language ? language + '/' : '') +
link.page +
'.html';
} else {
href = siteConfig.baseUrl + link.page + '.html';
}
Expand All @@ -180,7 +174,7 @@ class HeaderNav extends React.Component {
render() {
const versionsLink =
this.props.baseUrl +
(ENABLE_TRANSLATION
(env.translation.enabled
? this.props.language + '/versions.html'
: 'versions.html');
return (
Expand All @@ -198,9 +192,9 @@ class HeaderNav extends React.Component {
<h2 className="headerTitle">{this.props.title}</h2>
)}
</a>
{ENABLE_VERSIONING && (
{env.versioning.enabled && (
<a href={versionsLink}>
<h3>{this.props.version || versions[0]}</h3>
<h3>{this.props.version || env.versioning.latestVersion}</h3>
</a>
)}
{this.renderResponsiveNav()}
Expand Down
68 changes: 68 additions & 0 deletions lib/server/env.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

const CWD = process.cwd();
const fs = require('fs-extra');
const path = require('path');

const join = path.join;

const languages_js = join(CWD, 'lanauages.js');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was spelled wrong :)

languages.js

const translation_js = join(CWD, 'translation.js');
Copy link
Contributor

@JoelMarcey JoelMarcey Dec 19, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs to be const translation_js = './translation.js; since this file is in the same directory as env.js, not as part of the current process' working directory.

const versions_json = join(CWD, 'versions.json');

class Translation {
constructor() {
this.enabled = false;
this.languages = [
{
enabled: true,
name: 'English',
tag: 'en',
},
];

this._load();
}

enabledLanguages() {
return this.languages.filter(lang => lang.enabled);
}

_load() {
if (fs.existsSync(languages_js)) {
this.enabled = true;
this.languages = require(language_js);
this.translation = require(translation_js);
}
}
}

class Versioning {
constructor() {
this.enabled = false;
this.latestVersion = null;
this.versions = [];

this._load();
}

_load() {
if (fs.existsSync(versions_json)) {
this.enabled = true;
this.versions = JSON.parse(fs.readFileSync(versions_json, 'utf8'));
this.latestVersion = this.versions[0];
}
}
}

const env = {
translation: new Translation(),
versioning: new Versioning(),
};

module.exports = env;
65 changes: 21 additions & 44 deletions lib/server/generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,30 +20,15 @@ function execute() {
const glob = require('glob');
const chalk = require('chalk');
const Site = require('../core/Site.js');
const env = require('./env.js');
const siteConfig = require(CWD + '/siteConfig.js');
const translate = require('./translate.js');
const versionFallback = require('./versionFallback.js');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am assuming this is removed because it is unused.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes this one is not used.


const feed = require('./feed.js');
const sitemap = require('./sitemap.js');

const join = path.join;

const ENABLE_TRANSLATION = fs.existsSync(join(CWD, 'languages.js'));
const ENABLE_VERSIONING = fs.existsSync(join(CWD, 'versions.json'));

let languages;
if (ENABLE_TRANSLATION) {
languages = require(CWD + '/languages.js');
} else {
languages = [
{
enabled: true,
name: 'English',
tag: 'en',
},
];
}
// create the folder path for a file if it does not exist, then write the file
function writeFileAndCreateFolder(file, content) {
mkdirp.sync(file.replace(new RegExp('/[^/]*$'), ''));
Expand Down Expand Up @@ -87,10 +72,9 @@ function execute() {
console.log('generate.js triggered...');

// array of tags of enabled languages
const enabledLanguages = [];
languages.filter(lang => lang.enabled).map(lang => {
enabledLanguages.push(lang.tag);
});
const enabledLanguages = env.translation
.enabledLanguages()
.map(lang => lang.tag);

readMetadata.generateMetadataDocs();
const Metadata = require('../core/metadata.js');
Expand Down Expand Up @@ -134,7 +118,7 @@ function execute() {
// determine what file to use according to its id
let file;
if (metadata.original_id) {
if (ENABLE_TRANSLATION && metadata.language !== 'en') {
if (env.translation.enabled && metadata.language !== 'en') {
file = join(CWD, 'translated_docs', metadata.language, metadata.source);
} else {
file = join(CWD, 'versioned_docs', metadata.source);
Expand All @@ -161,12 +145,7 @@ function execute() {
rawContent = insertTableOfContents(rawContent);
}

let latestVersion;
if (ENABLE_VERSIONING) {
latestVersion = JSON.parse(
fs.readFileSync(join(CWD, 'versions.json'), 'utf8')
)[0];
}
let latestVersion = env.versioning.latestVersion;

// replace any links to markdown files to their website html links
Object.keys(mdToHtml).forEach(function(key, index) {
Expand Down Expand Up @@ -207,7 +186,10 @@ function execute() {
writeFileAndCreateFolder(targetFile, str);

// generate english page redirects when languages are enabled
if (ENABLE_TRANSLATION && metadata.permalink.indexOf('docs/en') !== -1) {
if (
env.translation.enabled &&
metadata.permalink.indexOf('docs/en') !== -1
) {
const redirectComp = (
<Redirect
metadata={metadata}
Expand Down Expand Up @@ -443,21 +425,25 @@ function execute() {
str
);
}

// write to base level
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am thinking there is something funny going on in this section.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But I am not 100% sure yet.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was a change I made in order to generate default pages from English pages. Original code was to copy English pages to one level above. However those pages has {language} property as 'en' which causes links wrong. So I made the change to generate instead. Couldn't think of a problem it would cause, but let me run some tests first.

let language = '';
const str = renderToStaticMarkup(
<Site language={language} config={siteConfig}>
<ReactComp language={language} />
</Site>
);
writeFileAndCreateFolder(targetFile.replace('/en/', '/'), str);
} else {
// allow for rendering of other files not in pages/en folder
let language = 'en';
for (let i = 0; i < langParts.length; i++) {
if (enabledLanguages.indexOf(langParts[i]) !== -1) {
language = langParts[i];
}
}
let language = '';
translate.setLanguage(language);
const str = renderToStaticMarkup(
<Site language={language} config={siteConfig}>
<ReactComp language={language} />
</Site>
);
writeFileAndCreateFolder(targetFile, str);
writeFileAndCreateFolder(targetFile.replace('/en/', '/'), str);
}
fs.removeSync(tempFile);
} else if (!fs.lstatSync(file).isDirectory()) {
Expand All @@ -469,15 +455,6 @@ function execute() {
}
});

// copy html files in 'en' to base level as well
files = glob.sync(join(buildDir, 'en', '**'));
files.forEach(file => {
let targetFile = file.replace(join(buildDir, 'en'), join(buildDir));
if (file.match(/\.html$/)) {
fs.copySync(file, targetFile);
}
});

// Generate CNAME file if a custom domain is specified in siteConfig
if (siteConfig.cname) {
let targetFile = join(buildDir, 'CNAME');
Expand Down
Loading