Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
57884a1
[docs] render /components/buttons markdown at build time
eps1lon Apr 16, 2020
b70eb0e
temp: build all locales
eps1lon Apr 16, 2020
1489e85
fix: Move prepareMarkdown into own file
eps1lon Apr 16, 2020
d62f0d4
chore: name require methods
eps1lon Apr 19, 2020
c6dabe3
chore: extract MarkdownElement
eps1lon Apr 19, 2020
934cf67
feat: prepared markdown works without MarkdownDocs.new
eps1lon Apr 19, 2020
5038793
fix: reintroduce bundler level raw loader
eps1lon Apr 19, 2020
7977914
[docs] Switch /company to new markdown handling
eps1lon Apr 19, 2020
835509c
f
eps1lon Apr 19, 2020
2b142db
[docs] Apply MarkdownDocs.new to all pages
eps1lon Apr 19, 2020
6ebc7b9
MarkdownDocs.new -> MarkdownDocs
eps1lon Apr 19, 2020
daad550
fix: restore /versions
eps1lon Apr 19, 2020
d5fc434
docs: move blog to new markdown handling
eps1lon Apr 19, 2020
619ce95
chore: cleanup markdown handling
eps1lon Apr 19, 2020
4b83e3c
chore: use dedicated prop for rendered markdown
eps1lon Apr 19, 2020
1d107cb
fix: /versions cleanup
eps1lon Apr 19, 2020
7dc0f59
MarkdownElement.new -> MarkdownElement
eps1lon Apr 19, 2020
93ab66f
format
eps1lon Apr 19, 2020
1c83763
f markdown element
eps1lon Apr 19, 2020
c959c5c
fix: /api/ pages
eps1lon Apr 19, 2020
b79dec6
fix(MarkdownDocs): requireDemo is only required for demos
eps1lon Apr 19, 2020
8342259
fix: never flip markdown element text
eps1lon Apr 19, 2020
8fef6c4
fix: restore backers for landing page
eps1lon Apr 19, 2020
707b037
fix: Highlight code at runtime
eps1lon Apr 19, 2020
e485fac
fix: fallback to english for untranslated pages
eps1lon Apr 19, 2020
f53d164
fix: fix prop type error in grid
eps1lon Apr 19, 2020
f787291
fix: update docs:api
eps1lon Apr 19, 2020
b4f1645
chore: explain raw-loader
eps1lon Apr 19, 2020
11d35cd
only send the locales we need to
oliviertassinari Apr 19, 2020
c918ae7
Revert "only send the locales we need to"
oliviertassinari Apr 19, 2020
95ba579
fix ssr mismatch
oliviertassinari Apr 19, 2020
3ca42c3
Remove unnecessary async
eps1lon Apr 20, 2020
5eb4c33
AppTableOfContents.new -> AppTableOfContents
eps1lon Apr 20, 2020
d4cf31f
fix: trim code before highlighting
eps1lon Apr 20, 2020
4d63852
chore: explain `more` workaround
eps1lon Apr 20, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: Move prepareMarkdown into own file
bloats bundle of unrelated pages probably because prism has side-effects
  • Loading branch information
eps1lon committed Apr 19, 2020
commit 1489e85cc7d7334cad0aa55bd7e932e7bc20c08e
2 changes: 1 addition & 1 deletion docs/pages/components/buttons.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react';
import MarkdownDocsX from 'docs/src/modules/components/MarkdownDocs.new';
import { prepareMarkdown } from 'docs/src/modules/utils/parseMarkdown';
import prepareMarkdown from 'docs/src/modules/utils/prepareMarkdown';

const req = require.context('docs/src/pages/components/buttons', false, /\.(md|js|tsx)$/);
const reqSource = require.context(
Expand Down
188 changes: 0 additions & 188 deletions docs/src/modules/utils/parseMarkdown.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
import marked from 'marked/lib/marked';
import { LANGUAGES_IN_PROGRESS } from 'docs/src/modules/constants';
import kebabCase from 'lodash/kebabCase';
import { rewriteUrlForNextExport } from 'next/dist/next-server/lib/router/rewrite-url-for-export';
import textToHash from 'docs/src/modules/utils/textToHash';
import prism from 'docs/src/modules/components/prism';

const headerRegExp = /---[\r\n]([\s\S]*)[\r\n]---/;
const titleRegExp = /# (.*)[\r\n]/;
Expand Down Expand Up @@ -98,186 +93,3 @@ export function render(markdown, options = {}) {

return marked(markdown, markedOptions);
}

const externs = [
'https://material.io/',
'https://getbootstrap.com/',
'https://www.amazon.com/',
'https://materialdesignicons.com/',
'https://www.w3.org/',
'https://devexpress.github.io/',
'https://ui-kit.co/',
];

export function prepareMarkdown(config) {
const { pageFilename, req, reqSource } = config;

const demos = {};
const docs = {};
req.keys().forEach((filename) => {
if (filename.indexOf('.md') !== -1) {
const match = filename.match(/-([a-z]{2})\.md$/);

const userLanguage =
match && LANGUAGES_IN_PROGRESS.indexOf(match[1]) !== -1 ? match[1] : 'en';

const markdown = req(filename);
const contents = getContents(markdown);
const headers = getHeaders(markdown);

const title = headers.title || getTitle(markdown);
const description = headers.description || getDescription(markdown);

if (headers.components.length > 0) {
contents.push(`
## API

${headers.components
.map(
(component) =>
`- [<${component} />](${rewriteUrlForNextExport(`/api/${kebabCase(component)}`)})`,
)
.join('\n')}
`);
}

const headingHashes = {};
const toc = [];
const rendered = contents.map((content) => {
if (demos && demoRegexp.test(content)) {
try {
return JSON.parse(`{${content}}`);
} catch (err) {
console.error('JSON.parse fails with: ', `{${content}}`);
console.error(err);
return null;
}
}

return render(content, {
highlight(code, language) {
let prismLanguage;
switch (language) {
case 'ts':
prismLanguage = prism.languages.tsx;
break;

case 'js':
case 'sh':
prismLanguage = prism.languages.jsx;
break;

case 'diff':
prismLanguage = { ...prism.languages.diff };
// original `/^[-<].*$/m` matches lines starting with `<` which matches
// <SomeComponent />
// we will only use `-` as the deleted marker
prismLanguage.deleted = /^[-].*$/m;
break;

default:
prismLanguage = prism.languages[language];
break;
}

if (!prismLanguage) {
if (language) {
throw new Error(`unsupported language: "${language}", "${code}"`);
} else {
prismLanguage = prism.languages.jsx;
}
}

return prism.highlight(code, prismLanguage);
},
heading: (headingText, level) => {
// Small title. No need for an anchor.
// It's reducing the risk of duplicated id and it's fewer elements in the DOM.
if (level >= 4) {
return `<h${level}>${headingText}</h${level}>`;
}

const hash = textToHash(headingText, headingHashes);

/**
* create a nested structure with 2 levels starting with level 2 e.g.
* [{...level2, children: [level3, level3, level3]}, level2]
*/
if (level === 2) {
toc.push({
text: headingText,
level,
hash,
children: [],
});
} else if (level === 3) {
if (!toc[toc.length - 1]) {
throw new Error(`Missing parent level for: ${headingText}`);
}

toc[toc.length - 1].children.push({
text: headingText,
level,
hash,
});
}

return [
`<h${level}>`,
`<a class="anchor-link" id="${hash}"></a>`,
headingText,
`<a class="anchor-link-style" aria-hidden="true" aria-label="anchor" href="#${hash}">`,
'<svg><use xlink:href="#anchor-link-icon" /></svg>',
'</a>',
`</h${level}>`,
].join('');
},
link: (href, linkTitle, linkText) => {
let more = '';

if (externs.some((domain) => href.indexOf(domain) !== -1)) {
more = ' target="_blank" rel="noopener nofollow"';
}

let finalHref = href;

if (
userLanguage !== 'en' &&
finalHref.indexOf('/') === 0 &&
finalHref !== '/size-snapshot'
) {
finalHref = `/${userLanguage}${finalHref}`;
}

return `<a href="${finalHref}"${more}>${linkText}</a>`;
},
});
});
const location = headers.filename || `/docs/src/pages/${pageFilename}/${filename}`;

const localized = { description, location, rendered, toc, title };

docs[userLanguage] = localized;
} else if (filename.indexOf('.tsx') !== -1) {
const demoName = `pages/${pageFilename}/${filename
.replace(/\.\//g, '')
.replace(/\.tsx/g, '.js')}`;

demos[demoName] = {
...demos[demoName],
moduleTS: filename,
rawTS: reqSource(filename),
};
} else {
const demoName = `pages/${pageFilename}/${filename.replace(/\.\//g, '')}`;

demos[demoName] = {
...demos[demoName],
module: filename,
raw: reqSource(filename),
};
}
});

return { demos, docs };
}
Loading