Skip to content

Commit dc0c3ce

Browse files
committed
fix(embed): compatible ssr
1 parent 62ce447 commit dc0c3ce

File tree

3 files changed

+42
-19
lines changed

3 files changed

+42
-19
lines changed

packages/docsify-server-renderer/index.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { readFileSync } from 'fs'
77
import { resolve, basename } from 'path'
88
import resolvePathname from 'resolve-pathname'
99
import debug from 'debug'
10+
import { prerenderEmbed } from '../../src/core/render/embed'
1011

1112
function cwd (...args) {
1213
return resolve(process.cwd(), ...args)
@@ -61,7 +62,7 @@ export default class Renderer {
6162
const { loadSidebar, loadNavbar, coverpage } = this.config
6263

6364
const mainFile = this._getPath(url)
64-
this._renderHtml('main', await this._render(mainFile))
65+
this._renderHtml('main', await this._render(mainFile, 'main'))
6566

6667
if (loadSidebar) {
6768
const name = loadSidebar === true ? '_sidebar.md' : loadSidebar
@@ -120,6 +121,19 @@ export default class Renderer {
120121
case 'cover':
121122
html = this.compiler.cover(html)
122123
break
124+
case 'main':
125+
const tokens = await new Promise(r => {
126+
prerenderEmbed(
127+
{
128+
fetch: url => this._loadFile(this._getPath(url)),
129+
compiler: this.compiler,
130+
raw: html
131+
},
132+
r
133+
)
134+
})
135+
html = this.compiler.compile(tokens)
136+
break
123137
case 'navbar':
124138
case 'article':
125139
default:

src/core/render/compiler.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ export class Compiler {
109109

110110
if (config.include) {
111111
if (!isAbsolutePath(href)) {
112-
href = getPath(this.contentBase, href)
112+
href = getPath(process.env.SSR ? '' : this.contentBase, href)
113113
}
114114

115115
let media
@@ -182,6 +182,7 @@ export class Compiler {
182182
}
183183
// highlight code
184184
origin.code = renderer.code = function (code, lang = '') {
185+
code = code.replace(/@DOCSIFY_QM@/g, '`')
185186
const hl = Prism.highlight(
186187
code,
187188
Prism.languages[lang] || Prism.languages.markup

src/core/render/embed.js

+25-17
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,41 @@ import { merge } from '../util/core'
33

44
const cached = {}
55

6-
function walkFetchEmbed ({ step = 0, embedTokens, compile }, cb) {
6+
function walkFetchEmbed ({ step = 0, embedTokens, compile, fetch }, cb) {
77
const token = embedTokens[step]
88

99
if (!token) {
1010
return cb({})
1111
}
1212

13-
get(token.embed.url).then(text => {
13+
const next = text => {
1414
let embedToken
15-
16-
if (token.embed.type === 'markdown') {
17-
embedToken = compile.lexer(text)
18-
} else if (token.embed.type === 'code') {
19-
embedToken = compile.lexer(
20-
'```' +
21-
token.embed.lang +
22-
'\n' +
23-
text.replace(/`/g, '@DOCSIFY_QM@') +
24-
'\n```\n'
25-
)
15+
if (text) {
16+
if (token.embed.type === 'markdown') {
17+
embedToken = compile.lexer(text)
18+
} else if (token.embed.type === 'code') {
19+
embedToken = compile.lexer(
20+
'```' +
21+
token.embed.lang +
22+
'\n' +
23+
text.replace(/`/g, '@DOCSIFY_QM@') +
24+
'\n```\n'
25+
)
26+
}
2627
}
2728
cb({ token, embedToken })
28-
walkFetchEmbed({ step: ++step, compile, embedTokens }, cb)
29-
})
29+
walkFetchEmbed({ step: ++step, compile, embedTokens, fetch }, cb)
30+
}
31+
32+
if (process.env.SSR) {
33+
console.log(token.embed.url)
34+
fetch(token.embed.url).then(next)
35+
} else {
36+
get(token.embed.url).then(next)
37+
}
3038
}
3139

32-
export function prerenderEmbed ({ compiler, raw }, done) {
40+
export function prerenderEmbed ({ compiler, raw, fetch }, done) {
3341
let hit
3442
if ((hit = cached[raw])) {
3543
return done(hit)
@@ -65,7 +73,7 @@ export function prerenderEmbed ({ compiler, raw }, done) {
6573
})
6674

6775
let moveIndex = 0
68-
walkFetchEmbed({ compile, embedTokens }, ({ embedToken, token }) => {
76+
walkFetchEmbed({ compile, embedTokens, fetch }, ({ embedToken, token }) => {
6977
if (token) {
7078
const index = token.index + moveIndex
7179

0 commit comments

Comments
 (0)