fix(embed): compatible ssr
This commit is contained in:
parent
62ce447fc3
commit
dc0c3ced4e
3 changed files with 42 additions and 19 deletions
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
})
|
}
|
||||||
|
|
||||||
|
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
|
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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue