This commit is contained in:
haraldh 2020-03-03 14:16:51 +00:00
parent bc07729890
commit 12caec03a0
18 changed files with 28810 additions and 256 deletions

194
book.js
View file

@ -16,9 +16,6 @@ function playpen_text(playpen) {
} }
(function codeSnippets() { (function codeSnippets() {
// Hide Rust code lines prepended with a specific character
var hiding_character = "#";
function fetch_with_timeout(url, options, timeout = 6000) { function fetch_with_timeout(url, options, timeout = 6000) {
return Promise.race([ return Promise.race([
fetch(url, options), fetch(url, options),
@ -55,6 +52,15 @@ function playpen_text(playpen) {
editor.addEventListener("change", function (e) { editor.addEventListener("change", function (e) {
update_play_button(playpen_block, playground_crates); update_play_button(playpen_block, playground_crates);
}); });
// add Ctrl-Enter command to execute rust code
editor.commands.addCommand({
name: "run",
bindKey: {
win: "Ctrl-Enter",
mac: "Ctrl-Enter"
},
exec: _editor => run_rust_code(playpen_block)
});
} }
} }
} }
@ -101,31 +107,24 @@ function playpen_text(playpen) {
} }
let text = playpen_text(code_block); let text = playpen_text(code_block);
let classes = code_block.querySelector('code').classList;
let has_2018 = classes.contains("edition2018");
let edition = has_2018 ? "2018" : "2015";
var params = { var params = {
channel: "stable", version: "stable",
mode: "debug", optimize: "0",
edition: "2018", code: text,
crateType: "bin", edition: edition
tests: false,
code: text
}; };
if (text.indexOf("#![feature") !== -1) { if (text.indexOf("#![feature") !== -1) {
params.channel = "nightly"; params.version = "nightly";
}
if (text.indexOf("#[test]") !== -1) {
params.tests = "true";
}
if (text.indexOf("#![crate_type=\"lib\"]") !== -1) {
params.crateType = "lib";
} }
result_block.innerText = "Running..."; result_block.innerText = "Running...";
fetch_with_timeout("https://play.rust-lang.org/execute", { fetch_with_timeout("https://play.rust-lang.org/evaluate.json", {
headers: { headers: {
'Content-Type': "application/json", 'Content-Type': "application/json",
}, },
@ -134,7 +133,7 @@ function playpen_text(playpen) {
body: JSON.stringify(params) body: JSON.stringify(params)
}) })
.then(response => response.json()) .then(response => response.json())
.then(response => result_block.innerText = response.stderr + "\n\n" + response.stdout) .then(response => result_block.innerText = response.result)
.catch(error => result_block.innerText = "Playground Communication: " + error.message); .catch(error => result_block.innerText = "Playground Communication: " + error.message);
} }
@ -168,95 +167,59 @@ function playpen_text(playpen) {
Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) { Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) {
var code_block = block; var lines = Array.from(block.querySelectorAll('.boring'));
var pre_block = block.parentNode;
// hide lines
var lines = code_block.innerHTML.split("\n");
var first_non_hidden_line = false;
var lines_hidden = false;
var trimmed_line = "";
for (var n = 0; n < lines.length; n++) {
trimmed_line = lines[n].trim();
if (trimmed_line[0] == hiding_character && trimmed_line[1] != hiding_character) {
if (first_non_hidden_line) {
lines[n] = "<span class=\"hidden\">" + "\n" + lines[n].replace(/(\s*)# ?/, "$1") + "</span>";
}
else {
lines[n] = "<span class=\"hidden\">" + lines[n].replace(/(\s*)# ?/, "$1") + "\n" + "</span>";
}
lines_hidden = true;
}
else if (first_non_hidden_line) {
lines[n] = "\n" + lines[n];
}
else {
first_non_hidden_line = true;
}
if (trimmed_line[0] == hiding_character && trimmed_line[1] == hiding_character) {
lines[n] = lines[n].replace("##", "#")
}
}
code_block.innerHTML = lines.join("");
// If no lines were hidden, return // If no lines were hidden, return
if (!lines_hidden) { return; } if (!lines.length) { return; }
block.classList.add("hide-boring");
var buttons = document.createElement('div'); var buttons = document.createElement('div');
buttons.className = 'buttons'; buttons.className = 'buttons';
buttons.innerHTML = "<button class=\"fa fa-expand\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>"; buttons.innerHTML = "<button class=\"fa fa-expand\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>";
// add expand button // add expand button
var pre_block = block.parentNode;
pre_block.insertBefore(buttons, pre_block.firstChild); pre_block.insertBefore(buttons, pre_block.firstChild);
pre_block.querySelector('.buttons').addEventListener('click', function (e) { pre_block.querySelector('.buttons').addEventListener('click', function (e) {
if (e.target.classList.contains('fa-expand')) { if (e.target.classList.contains('fa-expand')) {
var lines = pre_block.querySelectorAll('span.hidden');
e.target.classList.remove('fa-expand'); e.target.classList.remove('fa-expand');
e.target.classList.add('fa-compress'); e.target.classList.add('fa-compress');
e.target.title = 'Hide lines'; e.target.title = 'Hide lines';
e.target.setAttribute('aria-label', e.target.title); e.target.setAttribute('aria-label', e.target.title);
Array.from(lines).forEach(function (line) { block.classList.remove('hide-boring');
line.classList.remove('hidden');
line.classList.add('unhidden');
});
} else if (e.target.classList.contains('fa-compress')) { } else if (e.target.classList.contains('fa-compress')) {
var lines = pre_block.querySelectorAll('span.unhidden');
e.target.classList.remove('fa-compress'); e.target.classList.remove('fa-compress');
e.target.classList.add('fa-expand'); e.target.classList.add('fa-expand');
e.target.title = 'Show hidden lines'; e.target.title = 'Show hidden lines';
e.target.setAttribute('aria-label', e.target.title); e.target.setAttribute('aria-label', e.target.title);
Array.from(lines).forEach(function (line) { block.classList.add('hide-boring');
line.classList.remove('unhidden');
line.classList.add('hidden');
});
} }
}); });
}); });
Array.from(document.querySelectorAll('pre code')).forEach(function (block) { if (window.playpen_copyable) {
var pre_block = block.parentNode; Array.from(document.querySelectorAll('pre code')).forEach(function (block) {
if (!pre_block.classList.contains('playpen')) { var pre_block = block.parentNode;
var buttons = pre_block.querySelector(".buttons"); if (!pre_block.classList.contains('playpen')) {
if (!buttons) { var buttons = pre_block.querySelector(".buttons");
buttons = document.createElement('div'); if (!buttons) {
buttons.className = 'buttons'; buttons = document.createElement('div');
pre_block.insertBefore(buttons, pre_block.firstChild); buttons.className = 'buttons';
pre_block.insertBefore(buttons, pre_block.firstChild);
}
var clipButton = document.createElement('button');
clipButton.className = 'fa fa-copy clip-button';
clipButton.title = 'Copy to clipboard';
clipButton.setAttribute('aria-label', clipButton.title);
clipButton.innerHTML = '<i class=\"tooltiptext\"></i>';
buttons.insertBefore(clipButton, buttons.firstChild);
} }
});
var clipButton = document.createElement('button'); }
clipButton.className = 'fa fa-copy clip-button';
clipButton.title = 'Copy to clipboard';
clipButton.setAttribute('aria-label', clipButton.title);
clipButton.innerHTML = '<i class=\"tooltiptext\"></i>';
buttons.insertBefore(clipButton, buttons.firstChild);
}
});
// Process playpen code blocks // Process playpen code blocks
Array.from(document.querySelectorAll(".playpen")).forEach(function (pre_block) { Array.from(document.querySelectorAll(".playpen")).forEach(function (pre_block) {
@ -274,19 +237,21 @@ function playpen_text(playpen) {
runCodeButton.title = 'Run this code'; runCodeButton.title = 'Run this code';
runCodeButton.setAttribute('aria-label', runCodeButton.title); runCodeButton.setAttribute('aria-label', runCodeButton.title);
var copyCodeClipboardButton = document.createElement('button');
copyCodeClipboardButton.className = 'fa fa-copy clip-button';
copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>';
copyCodeClipboardButton.title = 'Copy to clipboard';
copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title);
buttons.insertBefore(runCodeButton, buttons.firstChild); buttons.insertBefore(runCodeButton, buttons.firstChild);
buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild);
runCodeButton.addEventListener('click', function (e) { runCodeButton.addEventListener('click', function (e) {
run_rust_code(pre_block); run_rust_code(pre_block);
}); });
if (window.playpen_copyable) {
var copyCodeClipboardButton = document.createElement('button');
copyCodeClipboardButton.className = 'fa fa-copy clip-button';
copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>';
copyCodeClipboardButton.title = 'Copy to clipboard';
copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title);
buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild);
}
let code_block = pre_block.querySelector("code"); let code_block = pre_block.querySelector("code");
if (window.ace && code_block.classList.contains("editable")) { if (window.ace && code_block.classList.contains("editable")) {
var undoChangesButton = document.createElement('button'); var undoChangesButton = document.createElement('button');
@ -328,7 +293,7 @@ function playpen_text(playpen) {
themeToggleButton.focus(); themeToggleButton.focus();
} }
function set_theme(theme) { function set_theme(theme, store = true) {
let ace_theme; let ace_theme;
if (theme == 'coal' || theme == 'navy') { if (theme == 'coal' || theme == 'navy') {
@ -341,13 +306,11 @@ function playpen_text(playpen) {
stylesheets.ayuHighlight.disabled = false; stylesheets.ayuHighlight.disabled = false;
stylesheets.tomorrowNight.disabled = true; stylesheets.tomorrowNight.disabled = true;
stylesheets.highlight.disabled = true; stylesheets.highlight.disabled = true;
ace_theme = "ace/theme/tomorrow_night"; ace_theme = "ace/theme/tomorrow_night";
} else { } else {
stylesheets.ayuHighlight.disabled = true; stylesheets.ayuHighlight.disabled = true;
stylesheets.tomorrowNight.disabled = true; stylesheets.tomorrowNight.disabled = true;
stylesheets.highlight.disabled = false; stylesheets.highlight.disabled = false;
ace_theme = "ace/theme/dawn"; ace_theme = "ace/theme/dawn";
} }
@ -365,9 +328,10 @@ function playpen_text(playpen) {
try { previousTheme = localStorage.getItem('mdbook-theme'); } catch (e) { } try { previousTheme = localStorage.getItem('mdbook-theme'); } catch (e) { }
if (previousTheme === null || previousTheme === undefined) { previousTheme = default_theme; } if (previousTheme === null || previousTheme === undefined) { previousTheme = default_theme; }
try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } if (store) {
try { localStorage.setItem('mdbook-theme', theme); } catch (e) { }
}
document.body.className = theme;
html.classList.remove(previousTheme); html.classList.remove(previousTheme);
html.classList.add(theme); html.classList.add(theme);
} }
@ -377,7 +341,7 @@ function playpen_text(playpen) {
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; } if (theme === null || theme === undefined) { theme = default_theme; }
set_theme(theme); set_theme(theme, false);
themeToggleButton.addEventListener('click', function () { themeToggleButton.addEventListener('click', function () {
if (themePopup.style.display === 'block') { if (themePopup.style.display === 'block') {
@ -399,7 +363,7 @@ function playpen_text(playpen) {
} }
}); });
// Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang-nursery/mdBook/issues/628 // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628
document.addEventListener('click', function(e) { document.addEventListener('click', function(e) {
if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) {
hideThemes(); hideThemes();
@ -444,8 +408,10 @@ function playpen_text(playpen) {
(function sidebar() { (function sidebar() {
var html = document.querySelector("html"); var html = document.querySelector("html");
var sidebar = document.getElementById("sidebar"); var sidebar = document.getElementById("sidebar");
var sidebarScrollBox = document.getElementById("sidebar-scrollbox");
var sidebarLinks = document.querySelectorAll('#sidebar a'); var sidebarLinks = document.querySelectorAll('#sidebar a');
var sidebarToggleButton = document.getElementById("sidebar-toggle"); var sidebarToggleButton = document.getElementById("sidebar-toggle");
var sidebarResizeHandle = document.getElementById("sidebar-resize-handle");
var firstContact = null; var firstContact = null;
function showSidebar() { function showSidebar() {
@ -459,6 +425,17 @@ function playpen_text(playpen) {
try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { }
} }
var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle');
function toggleSection(ev) {
ev.currentTarget.parentElement.classList.toggle('expanded');
}
Array.from(sidebarAnchorToggles).forEach(function (el) {
el.addEventListener('click', toggleSection);
});
function hideSidebar() { function hideSidebar() {
html.classList.remove('sidebar-visible') html.classList.remove('sidebar-visible')
html.classList.add('sidebar-hidden'); html.classList.add('sidebar-hidden');
@ -485,6 +462,23 @@ function playpen_text(playpen) {
} }
}); });
sidebarResizeHandle.addEventListener('mousedown', initResize, false);
function initResize(e) {
window.addEventListener('mousemove', resize, false);
window.addEventListener('mouseup', stopResize, false);
html.classList.add('sidebar-resizing');
}
function resize(e) {
document.documentElement.style.setProperty('--sidebar-width', (e.clientX - sidebar.offsetLeft) + 'px');
}
//on mouseup remove windows functions mousemove & mouseup
function stopResize(e) {
html.classList.remove('sidebar-resizing');
window.removeEventListener('mousemove', resize, false);
window.removeEventListener('mouseup', stopResize, false);
}
document.addEventListener('touchstart', function (e) { document.addEventListener('touchstart', function (e) {
firstContact = { firstContact = {
x: e.touches[0].clientX, x: e.touches[0].clientX,
@ -513,7 +507,7 @@ function playpen_text(playpen) {
// Scroll sidebar to current active section // Scroll sidebar to current active section
var activeSection = sidebar.querySelector(".active"); var activeSection = sidebar.querySelector(".active");
if (activeSection) { if (activeSection) {
sidebar.scrollTop = activeSection.offsetTop; sidebarScrollBox.scrollTop = activeSection.offsetTop;
} }
})(); })();
@ -554,7 +548,7 @@ function playpen_text(playpen) {
elem.className = 'fa fa-copy tooltipped'; elem.className = 'fa fa-copy tooltipped';
} }
var clipboardSnippets = new Clipboard('.clip-button', { var clipboardSnippets = new ClipboardJS('.clip-button', {
text: function (trigger) { text: function (trigger) {
hideTooltip(trigger); hideTooltip(trigger);
let playpen = trigger.closest("pre"); let playpen = trigger.closest("pre");
@ -606,6 +600,6 @@ function playpen_text(playpen) {
menu.classList.remove('bordered'); menu.classList.remove('bordered');
} }
previousScrollTop = document.scrollingElement.scrollTop; previousScrollTop = Math.max(document.scrollingElement.scrollTop, 0);
}, { passive: true }); }, { passive: true });
})(); })();

14434
print.html

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -160,32 +160,32 @@ prints out the last <code>Error</code>.</p>
and improves inspecting the sources of an error.</p> and improves inspecting the sources of an error.</p>
<p>You can also run the tutorial examples in the checked out <p>You can also run the tutorial examples in the checked out
<a href="https://github.com/haraldh/chainerror">chainerror git repo</a>.</p> <a href="https://github.com/haraldh/chainerror">chainerror git repo</a>.</p>
<pre><code>$ cargo run -q --example tutorial1 <pre><code class="language-console">$ cargo run -q --example tutorial1
</code></pre> </code></pre>
<pre><pre class="playpen"><code class="language-rust">use std::error::Error; <pre><pre class="playpen"><code class="language-rust">use std::error::Error;
use std::io; use std::io;
use std::result::Result; use std::result::Result;
fn do_some_io() -&gt; Result&lt;(), Box&lt;Error + Send + Sync&gt;&gt; { fn do_some_io() -&gt; Result&lt;(), Box&lt;dyn Error + Send + Sync&gt;&gt; {
Err(io::Error::from(io::ErrorKind::NotFound))?; Err(io::Error::from(io::ErrorKind::NotFound))?;
Ok(()) Ok(())
} }
fn func2() -&gt; Result&lt;(), Box&lt;Error + Send + Sync&gt;&gt; { fn func2() -&gt; Result&lt;(), Box&lt;dyn Error + Send + Sync&gt;&gt; {
if let Err(_) = do_some_io() { if let Err(_) = do_some_io() {
Err(&quot;func2 error&quot;)?; Err(&quot;func2 error&quot;)?;
} }
Ok(()) Ok(())
} }
fn func1() -&gt; Result&lt;(), Box&lt;Error + Send + Sync&gt;&gt; { fn func1() -&gt; Result&lt;(), Box&lt;dyn Error + Send + Sync&gt;&gt; {
if let Err(_) = func2() { if let Err(_) = func2() {
Err(&quot;func1 error&quot;)?; Err(&quot;func1 error&quot;)?;
} }
Ok(()) Ok(())
} }
fn main() -&gt; Result&lt;(), Box&lt;Error + Send + Sync&gt;&gt; { fn main() -&gt; Result&lt;(), Box&lt;dyn Error + Send + Sync&gt;&gt; {
func1() func1()
} }
</code></pre></pre> </code></pre></pre>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -335,7 +335,7 @@
} }
} }
fn main() -&gt; Result&lt;(), Box&lt;std::error::Error + Send + Sync&gt;&gt; { fn main() -&gt; Result&lt;(), Box&lt;dyn std::error::Error + Send + Sync&gt;&gt; {
use mycrate::func1; use mycrate::func1;
use mycrate::ErrorKind; use mycrate::ErrorKind;
use std::error::Error; use std::error::Error;
@ -350,7 +350,7 @@ fn main() -&gt; Result&lt;(), Box&lt;std::error::Error + Send + Sync&gt;&gt; {
} }
eprintln!(); eprintln!();
let mut s: &amp;Error = &amp;e; let mut s: &amp;dyn Error = &amp;e;
while let Some(c) = s.source() { while let Some(c) = s.source() {
if let Some(ioerror) = c.downcast_ref::&lt;io::Error&gt;() { if let Some(ioerror) = c.downcast_ref::&lt;io::Error&gt;() {
eprintln!(&quot;caused by: std::io::Error: {}&quot;, ioerror); eprintln!(&quot;caused by: std::io::Error: {}&quot;, ioerror);

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff