mirror of
https://github.com/status-im/pluto.git
synced 2026-09-01 21:11:14 +00:00
124 lines
6.7 KiB
HTML
124 lines
6.7 KiB
HTML
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pluto · A grammar for data manipulation</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="A grammar for data manipulation"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Pluto · A grammar for data manipulation"/><meta property="og:type" content="website"/><meta property="og:url" content="https://status-im.github.io/pluto/index.html"/><meta property="og:description" content="A grammar for data manipulation"/><meta name="twitter:card" content="summary"/><link rel="shortcut icon" href="/pluto/img/favicon.png"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script type="text/javascript" src="/pluto/js/pluto.js"></script><link rel="stylesheet" href="/pluto/css/prism.css"/><link rel="stylesheet" href="/pluto/css/main.css"/></head><body><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/pluto/"><img class="logo" src="/pluto/img/logo_white.png" alt="Pluto"/><h2 class="headerTitleWithLogo">Pluto</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class=""><a href="/pluto/docs/Manifesto.html" target="_self">Docs</a></li><li class=""><a href="/pluto/examples.html" target="_self">Examples</a></li><li class="siteNavItemActive"><a href="/pluto/try.html" target="_self">Try</a></li></ul></nav></div></header></div></div><div class="navPusher"><div><!doctype html>
|
|
<html>
|
|
<head>
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/codemirror@5.40.2/lib/codemirror.css">
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
|
<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/material.indigo-pink.min.css">
|
|
<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/codemirror@5.40.2/lib/codemirror.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/codemirror@5.40.2/mode/clojure/clojure.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/parinfer@3.12.0/parinfer.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/parinfer-codemirror@1.4.2/parinfer-codemirror.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/ipfs/dist/index.min.js"></script>
|
|
<script src="https://cdn.rawgit.com/neocotic/qrious/master/dist/qrious.js"></script>
|
|
</head>
|
|
<body>
|
|
<script>
|
|
const ipfs = new window.Ipfs();
|
|
|
|
async function load() {
|
|
const buffer = await loadIPFS(ipfs, "QmWKqSanV4M4zrd55QMkvDMZEQyuHzCMHpX1Fs3dZeSExv");
|
|
return buffer.toString();
|
|
}
|
|
|
|
ipfs.once("ready", async () => {
|
|
const content = await load();
|
|
codeMirror.setValue(content);
|
|
})
|
|
|
|
function extensionLink(hash) {
|
|
return "https://get.status.im/extension/ipfs@" + hash;
|
|
}
|
|
|
|
async function loadIPFS(ipfs, hash) {
|
|
return ipfs.files.cat(hash);
|
|
}
|
|
|
|
async function publish() {
|
|
const content = codeMirror.getValue();
|
|
const filesAdded = await uploadIPFS(ipfs, content);
|
|
displayQR(extensionLink(filesAdded[0].hash));
|
|
}
|
|
|
|
function clearErrors() {
|
|
const elErrors = document.getElementById("errors");
|
|
elErrors.innerHTML = '';
|
|
elErrors.className = "";
|
|
}
|
|
|
|
function displayErrors(errors) {
|
|
const elErrors = document.getElementById("errors");
|
|
if (errors == null) {
|
|
elErrors.innerHTML = '<div>No errors</div>';
|
|
elErrors.classList.add("ok");
|
|
} else {
|
|
elErrors.classList.add("errors");
|
|
|
|
let names = errors.map( (error, i) => {
|
|
return [error.type, error.value]
|
|
})
|
|
var s = '<div>Errors</div><ul>';
|
|
names.forEach(function(element) {
|
|
s = s.concat("<li>" + element[0]);
|
|
if (element[1] != null) {
|
|
s = s.concat(":" + JSON.stringify(element[1]));
|
|
}
|
|
s = s.concat("</li>");
|
|
});
|
|
s = s.concat("</ul>")
|
|
elErrors.innerHTML = s;
|
|
}
|
|
}
|
|
|
|
function uploadIPFS(ipfs, s) {
|
|
return ipfs.files.add({path: 'extension.edn',
|
|
content: ipfs.types.Buffer.from(s, 'utf8')})
|
|
}
|
|
|
|
function clearQR() {
|
|
const qel = document.getElementById("qr-wrapper");
|
|
qel.innerHTML = '';
|
|
}
|
|
|
|
function displayQR(s) {
|
|
const qel = document.getElementById("qr-wrapper");
|
|
qel.innerHTML = '<canvas id="qr"></canvas><a href="' + s + '">Universal link</a>';
|
|
new QRious({
|
|
element: document.getElementById('qr'),
|
|
value: s,
|
|
size: 250
|
|
});
|
|
}
|
|
</script>
|
|
<div id="wrapper">
|
|
<main>
|
|
<div id="content"></div>
|
|
<div id="errors"></div>
|
|
</main>
|
|
<aside id="panel">
|
|
<p>A playground to experiment with extensions and easily publish them on IPFS. <br /> Go ahead, modify the default extension on the left side!</p>
|
|
<p>Find more details about building your own extension in this <a href="https://docs.status.im/docs/extensions_tutorial_chat_command.html">tutorial</a></p>
|
|
<button class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect" onclick="publish()">Publish</button>
|
|
<div id="qr-wrapper"></div>
|
|
</aside>
|
|
</div>
|
|
<script>
|
|
const codeMirror = CodeMirror(document.getElementById("content"));
|
|
codeMirror.setValue("Loading content ...");
|
|
codeMirror.on("change", function(c, change) {
|
|
clearErrors();
|
|
clearQR();
|
|
const read = pluto.reader.read(codeMirror.getValue());
|
|
const readJS = pluto.js.from_clj(read);
|
|
displayErrors(readJS.errors);
|
|
if (readJS.errors == null) {
|
|
const parsed = pluto.js.parse(read);
|
|
const parsedJS = pluto.js.from_clj(parsed);
|
|
displayErrors(parsedJS.errors);
|
|
}
|
|
});
|
|
parinferCodeMirror.init(codeMirror);
|
|
</script>
|
|
</body>
|
|
</html>
|
|
</div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/pluto/" class="nav-home"><img src="/pluto/img/logo_white.png" alt="Pluto" width="66" height="58"/></a><div><h5>Docs</h5><a href="docs/Tutorial">Getting Started</a><a href="docs/API">API Reference</a></div><div><h5>Community</h5><a href="https://chat.status.im">Project Chat</a><a href="https://twitter.com/ethstatus" target="_blank" rel="noreferrer noopener">Twitter</a></div><div><h5>More</h5><a href="https://blog.status.im/">Blog</a><a href="https://github.com/status-im/pluto/">GitHub</a></div></section><section class="copyright">Copyright © 2018 Status.im</section></footer></div></body></html> |