From dc0c3ced4ecbc9019b8b6b52633a712e34e00e92 Mon Sep 17 00:00:00 2001 From: "qingwei.li" Date: Mon, 12 Feb 2018 16:19:04 +0800 Subject: [PATCH] fix(embed): compatible ssr --- packages/docsify-server-renderer/index.js | 16 ++++++++- src/core/render/compiler.js | 3 +- src/core/render/embed.js | 42 ++++++++++++++--------- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/packages/docsify-server-renderer/index.js b/packages/docsify-server-renderer/index.js index b0507efb4..6c6b9b710 100644 --- a/packages/docsify-server-renderer/index.js +++ b/packages/docsify-server-renderer/index.js @@ -7,6 +7,7 @@ import { readFileSync } from 'fs' import { resolve, basename } from 'path' import resolvePathname from 'resolve-pathname' import debug from 'debug' +import { prerenderEmbed } from '../../src/core/render/embed' function cwd (...args) { return resolve(process.cwd(), ...args) @@ -61,7 +62,7 @@ export default class Renderer { const { loadSidebar, loadNavbar, coverpage } = this.config const mainFile = this._getPath(url) - this._renderHtml('main', await this._render(mainFile)) + this._renderHtml('main', await this._render(mainFile, 'main')) if (loadSidebar) { const name = loadSidebar === true ? '_sidebar.md' : loadSidebar @@ -120,6 +121,19 @@ export default class Renderer { case 'cover': html = this.compiler.cover(html) break + case 'main': + const tokens = await new Promise(r => { + prerenderEmbed( + { + fetch: url => this._loadFile(this._getPath(url)), + compiler: this.compiler, + raw: html + }, + r + ) + }) + html = this.compiler.compile(tokens) + break case 'navbar': case 'article': default: diff --git a/src/core/render/compiler.js b/src/core/render/compiler.js index 65715619a..30134776d 100644 --- a/src/core/render/compiler.js +++ b/src/core/render/compiler.js @@ -109,7 +109,7 @@ export class Compiler { if (config.include) { if (!isAbsolutePath(href)) { - href = getPath(this.contentBase, href) + href = getPath(process.env.SSR ? '' : this.contentBase, href) } let media @@ -182,6 +182,7 @@ export class Compiler { } // highlight code origin.code = renderer.code = function (code, lang = '') { + code = code.replace(/@DOCSIFY_QM@/g, '`') const hl = Prism.highlight( code, Prism.languages[lang] || Prism.languages.markup diff --git a/src/core/render/embed.js b/src/core/render/embed.js index 45f95e8a1..e4adc64e4 100644 --- a/src/core/render/embed.js +++ b/src/core/render/embed.js @@ -3,33 +3,41 @@ import { merge } from '../util/core' const cached = {} -function walkFetchEmbed ({ step = 0, embedTokens, compile }, cb) { +function walkFetchEmbed ({ step = 0, embedTokens, compile, fetch }, cb) { const token = embedTokens[step] if (!token) { return cb({}) } - get(token.embed.url).then(text => { + const next = text => { let embedToken - - if (token.embed.type === 'markdown') { - embedToken = compile.lexer(text) - } else if (token.embed.type === 'code') { - embedToken = compile.lexer( - '```' + - token.embed.lang + - '\n' + - text.replace(/`/g, '@DOCSIFY_QM@') + - '\n```\n' - ) + if (text) { + if (token.embed.type === 'markdown') { + embedToken = compile.lexer(text) + } else if (token.embed.type === 'code') { + embedToken = compile.lexer( + '```' + + token.embed.lang + + '\n' + + text.replace(/`/g, '@DOCSIFY_QM@') + + '\n```\n' + ) + } } cb({ token, embedToken }) - walkFetchEmbed({ step: ++step, compile, embedTokens }, cb) - }) + walkFetchEmbed({ step: ++step, compile, embedTokens, fetch }, cb) + } + + if (process.env.SSR) { + console.log(token.embed.url) + fetch(token.embed.url).then(next) + } else { + get(token.embed.url).then(next) + } } -export function prerenderEmbed ({ compiler, raw }, done) { +export function prerenderEmbed ({ compiler, raw, fetch }, done) { let hit if ((hit = cached[raw])) { return done(hit) @@ -65,7 +73,7 @@ export function prerenderEmbed ({ compiler, raw }, done) { }) let moveIndex = 0 - walkFetchEmbed({ compile, embedTokens }, ({ embedToken, token }) => { + walkFetchEmbed({ compile, embedTokens, fetch }, ({ embedToken, token }) => { if (token) { const index = token.index + moveIndex