From ea17dcc66cd4bf3154afa16b38d357b2285c8f5e Mon Sep 17 00:00:00 2001 From: Tom Schaible Date: Thu, 2 Apr 2020 08:27:03 -0400 Subject: [PATCH] updated the insertion of embedded tokens so it correctly handles embedded token results returning in any order fixes #970 --- src/core/render/embed.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/core/render/embed.js b/src/core/render/embed.js index 083fb7f97..8c0cf5755 100644 --- a/src/core/render/embed.js +++ b/src/core/render/embed.js @@ -1,6 +1,6 @@ +import stripIndent from 'strip-indent'; import { get } from '../fetch/ajax'; import { merge } from '../util/core'; -import stripIndent from 'strip-indent'; const cached = {}; @@ -117,17 +117,27 @@ export function prerenderEmbed({ compiler, raw = '', fetch }, done) { } }); - let moveIndex = 0; + // keep track of which tokens have been embedded so far + // so that we know where to insert the embedded tokens as they + // are returned + const moves = []; walkFetchEmbed({ compile, embedTokens, fetch }, ({ embedToken, token }) => { if (token) { - const index = token.index + moveIndex; + // iterate through the array of previously inserted tokens + // to determine where the current embedded tokens should be inserted + let index = token.index; + moves.forEach(pos => { + if (index > pos.start) { + index += pos.length; + } + }); merge(links, embedToken.links); tokens = tokens .slice(0, index) .concat(embedToken, tokens.slice(index + 1)); - moveIndex += embedToken.length - 1; + moves.push({ start: index, length: embedToken.length - 1 }); } else { cached[raw] = tokens.concat(); tokens.links = cached[raw].links = links;