Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Docs faster (#4913)
* - render blocks in a queue at the end
- don't reparse theproject

* don't delay between snippets

* hide snippets while rendering
  • Loading branch information
pelikhan committed Oct 25, 2018
1 parent 976f56a commit f58d375
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 21 deletions.
6 changes: 4 additions & 2 deletions docfiles/style.css
Expand Up @@ -86,7 +86,8 @@ code.lang-block::before,
code.lang-sim::before,
code.lang-cards::before,
code.lang-namespaces::before,
code.lang-codecard::before
code.lang-codecard::before,
code.lang-shadow::before
{
content:"...";
position: absolute;
Expand All @@ -101,7 +102,8 @@ code.lang-block,
code.lang-sim,
code.lang-cards,
code.lang-namespaces,
code.lang-codecard
code.lang-codecard,
code.lang-shadow
{
background-color: rgba(0,0,0,0.04);
color:transparent;
Expand Down
47 changes: 35 additions & 12 deletions pxtrunner/renderer.ts
Expand Up @@ -154,6 +154,34 @@ namespace pxt.runner {
}
}

let renderQueue: {
el: JQuery;
source: string;
options: blocks.BlocksRenderOptions;
cls: string;
render: (container: JQuery, r: pxt.runner.DecompileResult) => void;
}[] = [];
function consumeRenderQueueAsync(): Promise<void> {
return new Promise((resolve, reject) => {
const job = renderQueue.shift();
if (!job) return Promise.resolve(); // done

const { el, options, render, cls } = job;
return pxt.runner.decompileToBlocksAsync(el.text(), options)
.then((r) => {
try {
render(el, r);
} catch (e) {
console.error('error while rendering ' + el.html())
el.append($('<div/>').addClass("ui segment warning").text(e.message));
}
el.removeClass("lang-shadow");
return consumeRenderQueueAsync();
})
});

}

function renderNextSnippetAsync(cls: string,
render: (container: JQuery, r: pxt.runner.DecompileResult) => void,
options?: pxt.blocks.BlocksRenderOptions): Promise<void> {
Expand All @@ -166,17 +194,10 @@ namespace pxt.runner {
if (!options.layout) options.layout = pxt.blocks.BlockLayout.Align;
options.splitSvg = true;

return pxt.runner.decompileToBlocksAsync($el.text(), options)
.then((r) => {
try {
render($el, r);
} catch (e) {
console.error('error while rendering ' + $el.html())
$el.append($('<div/>').addClass("ui segment warning").text(e.message));
}
$el.removeClass(cls);
return Promise.delay(1, renderNextSnippetAsync(cls, render, options));
})
renderQueue.push({ el: $el, source: $el.text(), options, render, cls });
$el.addClass("lang-shadow");
$el.removeClass(cls);
return renderNextSnippetAsync(cls, render, options);
}

function renderSnippetsAsync(options: ClientRenderOptions): Promise<void> {
Expand Down Expand Up @@ -697,17 +718,19 @@ namespace pxt.runner {
});
}

renderQueue = [];
renderTypeScript(options);
return Promise.resolve()
.then(() => renderNextCodeCardAsync(options.codeCardClass, options))
.then(() => renderNamespaces(options))
.then(() => renderInlineBlocksAsync(options))
.then(() => renderLinksAsync(options, options.linksClass, options.snippetReplaceParent, false))
.then(() => renderLinksAsync(options, options.namespacesClass, options.snippetReplaceParent, true))
.then(() => renderSignaturesAsync(options))
.then(() => renderNextCodeCardAsync(options.codeCardClass, options))
.then(() => renderSnippetsAsync(options))
.then(() => renderBlocksAsync(options))
.then(() => renderBlocksXmlAsync(options))
.then(() => renderProjectAsync(options))
.then(() => consumeRenderQueueAsync())
}
}
27 changes: 22 additions & 5 deletions pxtrunner/runner.ts
Expand Up @@ -186,16 +186,33 @@ namespace pxt.runner {
console.error(msg)
}

let previousMainPackage: pxt.MainPackage = undefined;
function loadPackageAsync(id: string, code?: string) {
let host = mainPkg.host();
mainPkg = new pxt.MainPackage(host)
mainPkg._verspec = id ? /\w+:\w+/.test(id) ? id : "pub:" + id : "empty:tsprj"
const verspec = id ? /\w+:\w+/.test(id) ? id : "pub:" + id : "empty:tsprj";
let host: pxt.Host;
let downloadPackagePromise: Promise<void>;
let installPromise: Promise<void>;
if (previousMainPackage && previousMainPackage._verspec == verspec) {
mainPkg = previousMainPackage;
host = mainPkg.host();
downloadPackagePromise = Promise.resolve();
installPromise = Promise.resolve();
} else {
host = mainPkg.host();
mainPkg = new pxt.MainPackage(host)
mainPkg._verspec = id ? /\w+:\w+/.test(id) ? id : "pub:" + id : "empty:tsprj"
downloadPackagePromise = host.downloadPackageAsync(mainPkg);
installPromise = mainPkg.installAllAsync()
// cache previous package
previousMainPackage = mainPkg;
}


return host.downloadPackageAsync(mainPkg)
return downloadPackagePromise
.then(() => host.readFile(mainPkg, pxt.CONFIG_NAME))
.then(str => {
if (!str) return Promise.resolve()
return mainPkg.installAllAsync().then(() => {
return installPromise.then(() => {
if (code) {
//Set the custom code if provided for docs.
let epkg = getEditorPkg(mainPkg);
Expand Down
6 changes: 4 additions & 2 deletions webapp/public/docs.html
Expand Up @@ -54,7 +54,8 @@
code.lang-sim::before,
code.lang-cards::before,
code.lang-namespaces::before,
code.lang-codecard::before {
code.lang-codecard::before,
code.lang-shadow::before {
content: "...";
position: absolute;
top: calc(50% - 0.5em);
Expand All @@ -68,7 +69,8 @@
code.lang-sim,
code.lang-cards,
code.lang-namespaces,
code.lang-codecard {
code.lang-codecard,
code.lang-shadow {
color: transparent;
}
</style>
Expand Down

0 comments on commit f58d375

Please sign in to comment.