fix(embed): compatible ssr

This commit is contained in:
qingwei.li 2018-02-12 16:19:04 +08:00 • committed by cinwell.li
commit dc0c3ced4e
3 changed files with 42 additions and 19 deletions

View file

@ -7,6 +7,7 @@ import { readFileSync } from 'fs'
import { resolve, basename } from 'path' import { resolve, basename } from 'path'
import resolvePathname from 'resolve-pathname' import resolvePathname from 'resolve-pathname'
import debug from 'debug' import debug from 'debug'
import { prerenderEmbed } from '../../src/core/render/embed'
function cwd (...args) { function cwd (...args) {
return resolve(process.cwd(), ...args) return resolve(process.cwd(), ...args)
@ -61,7 +62,7 @@ export default class Renderer {
const { loadSidebar, loadNavbar, coverpage } = this.config const { loadSidebar, loadNavbar, coverpage } = this.config
const mainFile = this._getPath(url) const mainFile = this._getPath(url)
this._renderHtml('main', await this._render(mainFile)) this._renderHtml('main', await this._render(mainFile, 'main'))
if (loadSidebar) { if (loadSidebar) {
const name = loadSidebar === true ? '_sidebar.md' : loadSidebar const name = loadSidebar === true ? '_sidebar.md' : loadSidebar
@ -120,6 +121,19 @@ export default class Renderer {
case 'cover': case 'cover':
html = this.compiler.cover(html) html = this.compiler.cover(html)
break 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 'navbar':
case 'article': case 'article':
default: default:

View file

@ -109,7 +109,7 @@ export class Compiler {
if (config.include) { if (config.include) {
if (!isAbsolutePath(href)) { if (!isAbsolutePath(href)) {
href = getPath(this.contentBase, href) href = getPath(process.env.SSR ? '' : this.contentBase, href)
} }
let media let media
@ -182,6 +182,7 @@ export class Compiler {
} }
// highlight code // highlight code
origin.code = renderer.code = function (code, lang = '') { origin.code = renderer.code = function (code, lang = '') {
code = code.replace(/@DOCSIFY_QM@/g, '`')
const hl = Prism.highlight( const hl = Prism.highlight(
code, code,
Prism.languages[lang] || Prism.languages.markup Prism.languages[lang] || Prism.languages.markup

View file

@ -3,16 +3,16 @@ import { merge } from '../util/core'
const cached = {} const cached = {}
function walkFetchEmbed ({ step = 0, embedTokens, compile }, cb) { function walkFetchEmbed ({ step = 0, embedTokens, compile, fetch }, cb) {
const token = embedTokens[step] const token = embedTokens[step]
if (!token) { if (!token) {
return cb({}) return cb({})
} }
get(token.embed.url).then(text => { const next = text => {
let embedToken let embedToken
if (text) {
if (token.embed.type === 'markdown') { if (token.embed.type === 'markdown') {
embedToken = compile.lexer(text) embedToken = compile.lexer(text)
} else if (token.embed.type === 'code') { } else if (token.embed.type === 'code') {
@ -24,12 +24,20 @@ function walkFetchEmbed ({ step = 0, embedTokens, compile }, cb) {
'\n```\n' '\n```\n'
) )
} }
}
cb({ token, embedToken }) cb({ token, embedToken })
walkFetchEmbed({ step: ++step, compile, embedTokens }, cb) walkFetchEmbed({ step: ++step, compile, embedTokens, fetch }, cb)
})
} }
export function prerenderEmbed ({ compiler, raw }, done) { 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, fetch }, done) {
let hit let hit
if ((hit = cached[raw])) { if ((hit = cached[raw])) {
return done(hit) return done(hit)
@ -65,7 +73,7 @@ export function prerenderEmbed ({ compiler, raw }, done) {
}) })
let moveIndex = 0 let moveIndex = 0
walkFetchEmbed({ compile, embedTokens }, ({ embedToken, token }) => { walkFetchEmbed({ compile, embedTokens, fetch }, ({ embedToken, token }) => {
if (token) { if (token) {
const index = token.index + moveIndex const index = token.index + moveIndex