Skip to content

Commit 384227a

Browse files
committed
Fix out of order embedding of files
- added double quote as attribute marker - fixed inject order of embedded files - added e2e test covering order of embedded files Signed-off-by: Martin Mihálek <aenniw@gmail.com>
1 parent 9e62be9 commit 384227a

13 files changed

+70
-17
lines changed

cypress/integration/sidebar/config.spec.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ context('sidebar.configurations', () => {
326326
const embedFilesIds = [
327327
'embedded-file-type',
328328
'embedded-code-fragments',
329+
'embedded-file-order',
329330
'tag-attribute',
330331
'the-code-block-highlight',
331332
];
@@ -336,7 +337,7 @@ context('sidebar.configurations', () => {
336337
cy.get(`a.section-link[href='#/embed-files?id=${id}']`)
337338
.click()
338339
.then(() => {
339-
cy.wait(500);
340+
cy.wait(750);
340341
cy.matchImageSnapshot();
341342
});
342343
});

cypress/live.server.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,16 @@ console.log('[e2e tests] : args passed to live server', args)
77
const params = {
88
port: args[0] || 3000,
99
root: args[1] || fixturePath,
10-
open: false
10+
open: false,
11+
middleware: [
12+
function(req, res, next) {
13+
if (req.url === '/_media/delayed.md') {
14+
setTimeout(next, 3000);
15+
} else {
16+
next();
17+
}
18+
},
19+
],
1120
// NoBrowser: true
12-
}
13-
LiveServer.start(params)
21+
};
22+
LiveServer.start(params)

cypress/support/commands.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@
2626

2727
import { addMatchImageSnapshotCommand } from 'cypress-image-snapshot/command'
2828
addMatchImageSnapshotCommand({
29-
failureThreshold: 10.0,
29+
failureThreshold: 0.10,
3030
failureThresholdType: 'percent',
31-
customDiffConfig: { threshold: 10.0 },
3231
capture: 'viewport',
3332
timeout: '60000'
3433
})

docs/_media/delayed.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
- This is from the `delayed.md`
2+
3+
```bash
4+
sleep 1000
5+
echo delayed
6+
exit 0
7+
```

docs/_media/non-delayed.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
- This is from the `no-delay.md`
2+
3+
```bash
4+
sleep 0
5+
echo non-delayed
6+
exit 0
7+
```

docs/embed-files.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ Example:
5353

5454
[filename](_media/example.js ':include :type=code :fragment=demo')
5555

56+
## Embedded file order
57+
58+
Then the content of `delayed.md` `non-delayed.md` and will be displayed directly here in correct order
59+
60+
[delayed](_media/delayed.md ':include')
61+
62+
---
63+
64+
[non-delayed](_media/non-delayed.md ':include')
65+
66+
You can check the original content for [delayed.md](_media/delayed.md ':ignore'), [non-delayed.md](_media/non-delayed.md ':ignore').
5667

5768
## Tag attribute
5869

src/core/render/embed.js

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ import { get } from '../fetch/ajax';
22
import { merge } from '../util/core';
33
import stripIndent from 'strip-indent';
44

5+
const INCLUDE_COMPONENT = '__include__';
56
const cached = {};
67

78
function walkFetchEmbed({ embedTokens, compile, fetch }, cb) {
89
let token;
910
let step = 0;
10-
let count = 1;
11+
let count = 0;
1112

1213
if (!embedTokens.length) {
1314
return cb({});
@@ -65,7 +66,7 @@ function walkFetchEmbed({ embedTokens, compile, fetch }, cb) {
6566
}
6667

6768
cb({ token, embedToken });
68-
if (++count >= step) {
69+
if (++count >= embedTokens.length) {
6970
cb({});
7071
}
7172
};
@@ -83,6 +84,23 @@ function walkFetchEmbed({ embedTokens, compile, fetch }, cb) {
8384
}
8485
}
8586

87+
function expandInclude(tokens) {
88+
if (!tokens) {
89+
return tokens;
90+
}
91+
92+
const expandedTokens = [];
93+
tokens.forEach(e => {
94+
if (e.type === INCLUDE_COMPONENT && e.components) {
95+
e.components.forEach(c => expandedTokens.push(c));
96+
} else {
97+
expandedTokens.push(e);
98+
}
99+
});
100+
101+
return expandedTokens;
102+
}
103+
86104
export function prerenderEmbed({ compiler, raw = '', fetch }, done) {
87105
let hit = cached[raw];
88106
if (hit) {
@@ -117,18 +135,19 @@ export function prerenderEmbed({ compiler, raw = '', fetch }, done) {
117135
}
118136
});
119137

120-
let moveIndex = 0;
121138
walkFetchEmbed({ compile, embedTokens, fetch }, ({ embedToken, token }) => {
122139
if (token) {
123-
const index = token.index + moveIndex;
124-
125140
merge(links, embedToken.links);
126141

127-
tokens = tokens
128-
.slice(0, index)
129-
.concat(embedToken, tokens.slice(index + 1));
130-
moveIndex += embedToken.length - 1;
142+
tokens = tokens.slice(0, token.index).concat(
143+
{
144+
type: INCLUDE_COMPONENT,
145+
components: embedToken,
146+
},
147+
tokens.slice(token.index + 1)
148+
);
131149
} else {
150+
tokens = expandInclude(tokens);
132151
cached[raw] = tokens.concat();
133152
tokens.links = cached[raw].links = links;
134153
done(tokens);

src/core/render/utils.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ export function getAndRemoveConfig(str = '') {
33

44
if (str) {
55
str = str
6-
.replace(/^'/, '')
7-
.replace(/'$/, '')
6+
.replace(/^("|')/, '')
7+
.replace(/("|')$/, '')
88
.replace(/(?:^|\s):([\w-]+:?)=?([\w-]+)?/g, (m, key, value) => {
99
if (key.indexOf(':') === -1) {
1010
config[key] = (value && value.replace(/&quot;/g, '')) || true;

0 commit comments

Comments
 (0)