Local external files
This commit is contained in:
parent
a837997f82
commit
98b11c18f7
3
frontend/Makefile
Normal file
3
frontend/Makefile
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
.PHONY: deploy
|
||||||
|
deploy:
|
||||||
|
rsync -avr *.{css,js,html} rediger:/var/www/sites/tmp.fnordig.de/hare-playground/
|
72
frontend/app.js
Normal file
72
frontend/app.js
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
import {CodeJar} from "./codejar.js"
|
||||||
|
const highlight = editor => {
|
||||||
|
editor.textContent = editor.textContent
|
||||||
|
hljs.highlightElement(editor)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function base64ToBytes(base64) {
|
||||||
|
const binString = atob(base64);
|
||||||
|
return Uint8Array.from(binString, (m) => m.codePointAt(0));
|
||||||
|
}
|
||||||
|
function base64Encode(str) {
|
||||||
|
return bytesToBase64(new TextEncoder().encode(str));
|
||||||
|
}
|
||||||
|
|
||||||
|
function bytesToBase64(bytes) {
|
||||||
|
const binString = Array.from(bytes, (byte) =>
|
||||||
|
String.fromCodePoint(byte),
|
||||||
|
).join("");
|
||||||
|
return btoa(binString);
|
||||||
|
}
|
||||||
|
function base64Decode(bytes) {
|
||||||
|
return new TextDecoder().decode(base64ToBytes(bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
let jar = CodeJar(document.querySelector('.editor'), highlight)
|
||||||
|
const defaultCode = `use fmt;
|
||||||
|
|
||||||
|
export fn main() void = {
|
||||||
|
const greetings = [
|
||||||
|
"Hello, world!",
|
||||||
|
"¡Hola Mundo!",
|
||||||
|
"Γειά σου Κόσμε!",
|
||||||
|
"Привіт, світ!",
|
||||||
|
"こんにちは世界!",
|
||||||
|
];
|
||||||
|
for (let i = 0z; i < len(greetings); i+= 1) {
|
||||||
|
fmt::println(greetings[i])!;
|
||||||
|
};
|
||||||
|
};`
|
||||||
|
|
||||||
|
if (location.hash) {
|
||||||
|
let code = base64Decode(location.hash.substr(1));
|
||||||
|
jar.updateCode(code)
|
||||||
|
} else {
|
||||||
|
location.hash = base64Encode(defaultCode);
|
||||||
|
jar.updateCode(defaultCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
let shareLink = document.createElement("a");
|
||||||
|
shareLink.href = "#";
|
||||||
|
shareLink.onclick = (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
let code = document.querySelector('.editor').innerText;
|
||||||
|
location.hash = base64Encode(code);
|
||||||
|
|
||||||
|
if (navigator.clipboard) {
|
||||||
|
let text = location.href;
|
||||||
|
navigator.clipboard.writeText(text).then(function() {
|
||||||
|
document.querySelector("codapi-status").innerText = "Link copied!"
|
||||||
|
}, function(err) {
|
||||||
|
document.querySelector("codapi-status").innerText = "Link changed. Copy the URL now."
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
document.querySelector("codapi-status").innerText = "Link changed. Copy the URL now."
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let shareText = document.createTextNode("Share");
|
||||||
|
shareLink.appendChild(shareText);
|
||||||
|
let editLink = document.querySelector("codapi-toolbar a");
|
||||||
|
editLink.insertAdjacentElement('afterend', shareLink);
|
10
frontend/github.min.css
vendored
Normal file
10
frontend/github.min.css
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
|
||||||
|
Theme: GitHub
|
||||||
|
Description: Light theme as seen on github.com
|
||||||
|
Author: github.com
|
||||||
|
Maintainer: @Hirse
|
||||||
|
Updated: 2021-05-15
|
||||||
|
|
||||||
|
Outdated base version: https://github.com/primer/github-syntax-light
|
||||||
|
Current colors taken from GitHub's CSS
|
||||||
|
*/.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}
|
348
frontend/highlight.min.js
vendored
Normal file
348
frontend/highlight.min.js
vendored
Normal file
|
@ -0,0 +1,348 @@
|
||||||
|
/*!
|
||||||
|
Highlight.js v11.9.0 (git: b7ec4bfafc)
|
||||||
|
(c) 2006-2024 undefined and other contributors
|
||||||
|
License: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
var hljs=function(){"use strict";function e(t){
|
||||||
|
return t instanceof Map?t.clear=t.delete=t.set=()=>{
|
||||||
|
throw Error("map is read-only")}:t instanceof Set&&(t.add=t.clear=t.delete=()=>{
|
||||||
|
throw Error("set is read-only")
|
||||||
|
}),Object.freeze(t),Object.getOwnPropertyNames(t).forEach((n=>{
|
||||||
|
const i=t[n],s=typeof i;"object"!==s&&"function"!==s||Object.isFrozen(i)||e(i)
|
||||||
|
})),t}class t{constructor(e){
|
||||||
|
void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}
|
||||||
|
ignoreMatch(){this.isMatchIgnored=!0}}function n(e){
|
||||||
|
return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")
|
||||||
|
}function i(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t]
|
||||||
|
;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const s=e=>!!e.scope
|
||||||
|
;class o{constructor(e,t){
|
||||||
|
this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){
|
||||||
|
this.buffer+=n(e)}openNode(e){if(!s(e))return;const t=((e,{prefix:t})=>{
|
||||||
|
if(e.startsWith("language:"))return e.replace("language:","language-")
|
||||||
|
;if(e.includes(".")){const n=e.split(".")
|
||||||
|
;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ")
|
||||||
|
}return`${t}${e}`})(e.scope,{prefix:this.classPrefix});this.span(t)}
|
||||||
|
closeNode(e){s(e)&&(this.buffer+="</span>")}value(){return this.buffer}span(e){
|
||||||
|
this.buffer+=`<span class="${e}">`}}const r=(e={})=>{const t={children:[]}
|
||||||
|
;return Object.assign(t,e),t};class a{constructor(){
|
||||||
|
this.rootNode=r(),this.stack=[this.rootNode]}get top(){
|
||||||
|
return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){
|
||||||
|
this.top.children.push(e)}openNode(e){const t=r({scope:e})
|
||||||
|
;this.add(t),this.stack.push(t)}closeNode(){
|
||||||
|
if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){
|
||||||
|
for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}
|
||||||
|
walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){
|
||||||
|
return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t),
|
||||||
|
t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){
|
||||||
|
"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{
|
||||||
|
a._collapse(e)})))}}class c extends a{constructor(e){super(),this.options=e}
|
||||||
|
addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){
|
||||||
|
this.closeNode()}__addSublanguage(e,t){const n=e.root
|
||||||
|
;t&&(n.scope="language:"+t),this.add(n)}toHTML(){
|
||||||
|
return new o(this,this.options).value()}finalize(){
|
||||||
|
return this.closeAllNodes(),!0}}function l(e){
|
||||||
|
return e?"string"==typeof e?e:e.source:null}function g(e){return h("(?=",e,")")}
|
||||||
|
function u(e){return h("(?:",e,")*")}function d(e){return h("(?:",e,")?")}
|
||||||
|
function h(...e){return e.map((e=>l(e))).join("")}function f(...e){const t=(e=>{
|
||||||
|
const t=e[e.length-1]
|
||||||
|
;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{}
|
||||||
|
})(e);return"("+(t.capture?"":"?:")+e.map((e=>l(e))).join("|")+")"}
|
||||||
|
function p(e){return RegExp(e.toString()+"|").exec("").length-1}
|
||||||
|
const b=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./
|
||||||
|
;function m(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n
|
||||||
|
;let i=l(e),s="";for(;i.length>0;){const e=b.exec(i);if(!e){s+=i;break}
|
||||||
|
s+=i.substring(0,e.index),
|
||||||
|
i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?s+="\\"+(Number(e[1])+t):(s+=e[0],
|
||||||
|
"("===e[0]&&n++)}return s})).map((e=>`(${e})`)).join(t)}
|
||||||
|
const E="[a-zA-Z]\\w*",x="[a-zA-Z_]\\w*",w="\\b\\d+(\\.\\d+)?",y="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",_="\\b(0b[01]+)",O={
|
||||||
|
begin:"\\\\[\\s\\S]",relevance:0},v={scope:"string",begin:"'",end:"'",
|
||||||
|
illegal:"\\n",contains:[O]},k={scope:"string",begin:'"',end:'"',illegal:"\\n",
|
||||||
|
contains:[O]},N=(e,t,n={})=>{const s=i({scope:"comment",begin:e,end:t,
|
||||||
|
contains:[]},n);s.contains.push({scope:"doctag",
|
||||||
|
begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",
|
||||||
|
end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0})
|
||||||
|
;const o=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/)
|
||||||
|
;return s.contains.push({begin:h(/[ ]+/,"(",o,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),s
|
||||||
|
},S=N("//","$"),M=N("/\\*","\\*/"),R=N("#","$");var j=Object.freeze({
|
||||||
|
__proto__:null,APOS_STRING_MODE:v,BACKSLASH_ESCAPE:O,BINARY_NUMBER_MODE:{
|
||||||
|
scope:"number",begin:_,relevance:0},BINARY_NUMBER_RE:_,COMMENT:N,
|
||||||
|
C_BLOCK_COMMENT_MODE:M,C_LINE_COMMENT_MODE:S,C_NUMBER_MODE:{scope:"number",
|
||||||
|
begin:y,relevance:0},C_NUMBER_RE:y,END_SAME_AS_BEGIN:e=>Object.assign(e,{
|
||||||
|
"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{
|
||||||
|
t.data._beginMatch!==e[1]&&t.ignoreMatch()}}),HASH_COMMENT_MODE:R,IDENT_RE:E,
|
||||||
|
MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+x,relevance:0},
|
||||||
|
NUMBER_MODE:{scope:"number",begin:w,relevance:0},NUMBER_RE:w,
|
||||||
|
PHRASAL_WORDS_MODE:{
|
||||||
|
begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/
|
||||||
|
},QUOTE_STRING_MODE:k,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/,
|
||||||
|
end:/\/[gimuy]*/,contains:[O,{begin:/\[/,end:/\]/,relevance:0,contains:[O]}]},
|
||||||
|
RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",
|
||||||
|
SHEBANG:(e={})=>{const t=/^#![ ]*\//
|
||||||
|
;return e.binary&&(e.begin=h(t,/.*\b/,e.binary,/\b.*/)),i({scope:"meta",begin:t,
|
||||||
|
end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)},
|
||||||
|
TITLE_MODE:{scope:"title",begin:E,relevance:0},UNDERSCORE_IDENT_RE:x,
|
||||||
|
UNDERSCORE_TITLE_MODE:{scope:"title",begin:x,relevance:0}});function A(e,t){
|
||||||
|
"."===e.input[e.index-1]&&t.ignoreMatch()}function I(e,t){
|
||||||
|
void 0!==e.className&&(e.scope=e.className,delete e.className)}function T(e,t){
|
||||||
|
t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",
|
||||||
|
e.__beforeBegin=A,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,
|
||||||
|
void 0===e.relevance&&(e.relevance=0))}function L(e,t){
|
||||||
|
Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function B(e,t){
|
||||||
|
if(e.match){
|
||||||
|
if(e.begin||e.end)throw Error("begin & end are not supported with match")
|
||||||
|
;e.begin=e.match,delete e.match}}function P(e,t){
|
||||||
|
void 0===e.relevance&&(e.relevance=1)}const D=(e,t)=>{if(!e.beforeMatch)return
|
||||||
|
;if(e.starts)throw Error("beforeMatch cannot be used with starts")
|
||||||
|
;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t]
|
||||||
|
})),e.keywords=n.keywords,e.begin=h(n.beforeMatch,g(n.begin)),e.starts={
|
||||||
|
relevance:0,contains:[Object.assign(n,{endsParent:!0})]
|
||||||
|
},e.relevance=0,delete n.beforeMatch
|
||||||
|
},H=["of","and","for","in","not","or","if","then","parent","list","value"],C="keyword"
|
||||||
|
;function $(e,t,n=C){const i=Object.create(null)
|
||||||
|
;return"string"==typeof e?s(n,e.split(" ")):Array.isArray(e)?s(n,e):Object.keys(e).forEach((n=>{
|
||||||
|
Object.assign(i,$(e[n],t,n))})),i;function s(e,n){
|
||||||
|
t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|")
|
||||||
|
;i[n[0]]=[e,U(n[0],n[1])]}))}}function U(e,t){
|
||||||
|
return t?Number(t):(e=>H.includes(e.toLowerCase()))(e)?0:1}const z={},W=e=>{
|
||||||
|
console.error(e)},X=(e,...t)=>{console.log("WARN: "+e,...t)},G=(e,t)=>{
|
||||||
|
z[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),z[`${e}/${t}`]=!0)
|
||||||
|
},K=Error();function F(e,t,{key:n}){let i=0;const s=e[n],o={},r={}
|
||||||
|
;for(let e=1;e<=t.length;e++)r[e+i]=s[e],o[e+i]=!0,i+=p(t[e-1])
|
||||||
|
;e[n]=r,e[n]._emit=o,e[n]._multi=!0}function Z(e){(e=>{
|
||||||
|
e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope,
|
||||||
|
delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={
|
||||||
|
_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope
|
||||||
|
}),(e=>{if(Array.isArray(e.begin)){
|
||||||
|
if(e.skip||e.excludeBegin||e.returnBegin)throw W("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),
|
||||||
|
K
|
||||||
|
;if("object"!=typeof e.beginScope||null===e.beginScope)throw W("beginScope must be object"),
|
||||||
|
K;F(e,e.begin,{key:"beginScope"}),e.begin=m(e.begin,{joinWith:""})}})(e),(e=>{
|
||||||
|
if(Array.isArray(e.end)){
|
||||||
|
if(e.skip||e.excludeEnd||e.returnEnd)throw W("skip, excludeEnd, returnEnd not compatible with endScope: {}"),
|
||||||
|
K
|
||||||
|
;if("object"!=typeof e.endScope||null===e.endScope)throw W("endScope must be object"),
|
||||||
|
K;F(e,e.end,{key:"endScope"}),e.end=m(e.end,{joinWith:""})}})(e)}function V(e){
|
||||||
|
function t(t,n){
|
||||||
|
return RegExp(l(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":""))
|
||||||
|
}class n{constructor(){
|
||||||
|
this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}
|
||||||
|
addRule(e,t){
|
||||||
|
t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),
|
||||||
|
this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null)
|
||||||
|
;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(m(e,{joinWith:"|"
|
||||||
|
}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex
|
||||||
|
;const t=this.matcherRe.exec(e);if(!t)return null
|
||||||
|
;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n]
|
||||||
|
;return t.splice(0,n),Object.assign(t,i)}}class s{constructor(){
|
||||||
|
this.rules=[],this.multiRegexes=[],
|
||||||
|
this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){
|
||||||
|
if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n
|
||||||
|
;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))),
|
||||||
|
t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){
|
||||||
|
return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){
|
||||||
|
this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){
|
||||||
|
const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex
|
||||||
|
;let n=t.exec(e)
|
||||||
|
;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{
|
||||||
|
const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}
|
||||||
|
return n&&(this.regexIndex+=n.position+1,
|
||||||
|
this.regexIndex===this.count&&this.considerAll()),n}}
|
||||||
|
if(e.compilerExtensions||(e.compilerExtensions=[]),
|
||||||
|
e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.")
|
||||||
|
;return e.classNameAliases=i(e.classNameAliases||{}),function n(o,r){const a=o
|
||||||
|
;if(o.isCompiled)return a
|
||||||
|
;[I,B,Z,D].forEach((e=>e(o,r))),e.compilerExtensions.forEach((e=>e(o,r))),
|
||||||
|
o.__beforeBegin=null,[T,L,P].forEach((e=>e(o,r))),o.isCompiled=!0;let c=null
|
||||||
|
;return"object"==typeof o.keywords&&o.keywords.$pattern&&(o.keywords=Object.assign({},o.keywords),
|
||||||
|
c=o.keywords.$pattern,
|
||||||
|
delete o.keywords.$pattern),c=c||/\w+/,o.keywords&&(o.keywords=$(o.keywords,e.case_insensitive)),
|
||||||
|
a.keywordPatternRe=t(c,!0),
|
||||||
|
r&&(o.begin||(o.begin=/\B|\b/),a.beginRe=t(a.begin),o.end||o.endsWithParent||(o.end=/\B|\b/),
|
||||||
|
o.end&&(a.endRe=t(a.end)),
|
||||||
|
a.terminatorEnd=l(a.end)||"",o.endsWithParent&&r.terminatorEnd&&(a.terminatorEnd+=(o.end?"|":"")+r.terminatorEnd)),
|
||||||
|
o.illegal&&(a.illegalRe=t(o.illegal)),
|
||||||
|
o.contains||(o.contains=[]),o.contains=[].concat(...o.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>i(e,{
|
||||||
|
variants:null},t)))),e.cachedVariants?e.cachedVariants:q(e)?i(e,{
|
||||||
|
starts:e.starts?i(e.starts):null
|
||||||
|
}):Object.isFrozen(e)?i(e):e))("self"===e?o:e)))),o.contains.forEach((e=>{n(e,a)
|
||||||
|
})),o.starts&&n(o.starts,r),a.matcher=(e=>{const t=new s
|
||||||
|
;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin"
|
||||||
|
}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end"
|
||||||
|
}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function q(e){
|
||||||
|
return!!e&&(e.endsWithParent||q(e.starts))}class J extends Error{
|
||||||
|
constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}}
|
||||||
|
const Y=n,Q=i,ee=Symbol("nomatch"),te=n=>{
|
||||||
|
const i=Object.create(null),s=Object.create(null),o=[];let r=!0
|
||||||
|
;const a="Could not find the language '{}', did you forget to load/include a language module?",l={
|
||||||
|
disableAutodetect:!0,name:"Plain text",contains:[]};let p={
|
||||||
|
ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,
|
||||||
|
languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",
|
||||||
|
cssSelector:"pre code",languages:null,__emitter:c};function b(e){
|
||||||
|
return p.noHighlightRe.test(e)}function m(e,t,n){let i="",s=""
|
||||||
|
;"object"==typeof t?(i=e,
|
||||||
|
n=t.ignoreIllegals,s=t.language):(G("10.7.0","highlight(lang, code, ...args) has been deprecated."),
|
||||||
|
G("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),
|
||||||
|
s=e,i=t),void 0===n&&(n=!0);const o={code:i,language:s};N("before:highlight",o)
|
||||||
|
;const r=o.result?o.result:E(o.language,o.code,n)
|
||||||
|
;return r.code=o.code,N("after:highlight",r),r}function E(e,n,s,o){
|
||||||
|
const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(R)
|
||||||
|
;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(R),n=""
|
||||||
|
;for(;t;){n+=R.substring(e,t.index)
|
||||||
|
;const s=_.case_insensitive?t[0].toLowerCase():t[0],o=(i=s,N.keywords[i]);if(o){
|
||||||
|
const[e,i]=o
|
||||||
|
;if(M.addText(n),n="",c[s]=(c[s]||0)+1,c[s]<=7&&(j+=i),e.startsWith("_"))n+=t[0];else{
|
||||||
|
const n=_.classNameAliases[e]||e;u(t[0],n)}}else n+=t[0]
|
||||||
|
;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(R)}var i
|
||||||
|
;n+=R.substring(e),M.addText(n)}function g(){null!=N.subLanguage?(()=>{
|
||||||
|
if(""===R)return;let e=null;if("string"==typeof N.subLanguage){
|
||||||
|
if(!i[N.subLanguage])return void M.addText(R)
|
||||||
|
;e=E(N.subLanguage,R,!0,S[N.subLanguage]),S[N.subLanguage]=e._top
|
||||||
|
}else e=x(R,N.subLanguage.length?N.subLanguage:null)
|
||||||
|
;N.relevance>0&&(j+=e.relevance),M.__addSublanguage(e._emitter,e.language)
|
||||||
|
})():l(),R=""}function u(e,t){
|
||||||
|
""!==e&&(M.startScope(t),M.addText(e),M.endScope())}function d(e,t){let n=1
|
||||||
|
;const i=t.length-1;for(;n<=i;){if(!e._emit[n]){n++;continue}
|
||||||
|
const i=_.classNameAliases[e[n]]||e[n],s=t[n];i?u(s,i):(R=s,l(),R=""),n++}}
|
||||||
|
function h(e,t){
|
||||||
|
return e.scope&&"string"==typeof e.scope&&M.openNode(_.classNameAliases[e.scope]||e.scope),
|
||||||
|
e.beginScope&&(e.beginScope._wrap?(u(R,_.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),
|
||||||
|
R=""):e.beginScope._multi&&(d(e.beginScope,t),R="")),N=Object.create(e,{parent:{
|
||||||
|
value:N}}),N}function f(e,n,i){let s=((e,t)=>{const n=e&&e.exec(t)
|
||||||
|
;return n&&0===n.index})(e.endRe,i);if(s){if(e["on:end"]){const i=new t(e)
|
||||||
|
;e["on:end"](n,i),i.isMatchIgnored&&(s=!1)}if(s){
|
||||||
|
for(;e.endsParent&&e.parent;)e=e.parent;return e}}
|
||||||
|
if(e.endsWithParent)return f(e.parent,n,i)}function b(e){
|
||||||
|
return 0===N.matcher.regexIndex?(R+=e[0],1):(T=!0,0)}function m(e){
|
||||||
|
const t=e[0],i=n.substring(e.index),s=f(N,e,i);if(!s)return ee;const o=N
|
||||||
|
;N.endScope&&N.endScope._wrap?(g(),
|
||||||
|
u(t,N.endScope._wrap)):N.endScope&&N.endScope._multi?(g(),
|
||||||
|
d(N.endScope,e)):o.skip?R+=t:(o.returnEnd||o.excludeEnd||(R+=t),
|
||||||
|
g(),o.excludeEnd&&(R=t));do{
|
||||||
|
N.scope&&M.closeNode(),N.skip||N.subLanguage||(j+=N.relevance),N=N.parent
|
||||||
|
}while(N!==s.parent);return s.starts&&h(s.starts,e),o.returnEnd?0:t.length}
|
||||||
|
let w={};function y(i,o){const a=o&&o[0];if(R+=i,null==a)return g(),0
|
||||||
|
;if("begin"===w.type&&"end"===o.type&&w.index===o.index&&""===a){
|
||||||
|
if(R+=n.slice(o.index,o.index+1),!r){const t=Error(`0 width match regex (${e})`)
|
||||||
|
;throw t.languageName=e,t.badRule=w.rule,t}return 1}
|
||||||
|
if(w=o,"begin"===o.type)return(e=>{
|
||||||
|
const n=e[0],i=e.rule,s=new t(i),o=[i.__beforeBegin,i["on:begin"]]
|
||||||
|
;for(const t of o)if(t&&(t(e,s),s.isMatchIgnored))return b(n)
|
||||||
|
;return i.skip?R+=n:(i.excludeBegin&&(R+=n),
|
||||||
|
g(),i.returnBegin||i.excludeBegin||(R=n)),h(i,e),i.returnBegin?0:n.length})(o)
|
||||||
|
;if("illegal"===o.type&&!s){
|
||||||
|
const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"<unnamed>")+'"')
|
||||||
|
;throw e.mode=N,e}if("end"===o.type){const e=m(o);if(e!==ee)return e}
|
||||||
|
if("illegal"===o.type&&""===a)return 1
|
||||||
|
;if(I>1e5&&I>3*o.index)throw Error("potential infinite loop, way more iterations than matches")
|
||||||
|
;return R+=a,a.length}const _=O(e)
|
||||||
|
;if(!_)throw W(a.replace("{}",e)),Error('Unknown language: "'+e+'"')
|
||||||
|
;const v=V(_);let k="",N=o||v;const S={},M=new p.__emitter(p);(()=>{const e=[]
|
||||||
|
;for(let t=N;t!==_;t=t.parent)t.scope&&e.unshift(t.scope)
|
||||||
|
;e.forEach((e=>M.openNode(e)))})();let R="",j=0,A=0,I=0,T=!1;try{
|
||||||
|
if(_.__emitTokens)_.__emitTokens(n,M);else{for(N.matcher.considerAll();;){
|
||||||
|
I++,T?T=!1:N.matcher.considerAll(),N.matcher.lastIndex=A
|
||||||
|
;const e=N.matcher.exec(n);if(!e)break;const t=y(n.substring(A,e.index),e)
|
||||||
|
;A=e.index+t}y(n.substring(A))}return M.finalize(),k=M.toHTML(),{language:e,
|
||||||
|
value:k,relevance:j,illegal:!1,_emitter:M,_top:N}}catch(t){
|
||||||
|
if(t.message&&t.message.includes("Illegal"))return{language:e,value:Y(n),
|
||||||
|
illegal:!0,relevance:0,_illegalBy:{message:t.message,index:A,
|
||||||
|
context:n.slice(A-100,A+100),mode:t.mode,resultSoFar:k},_emitter:M};if(r)return{
|
||||||
|
language:e,value:Y(n),illegal:!1,relevance:0,errorRaised:t,_emitter:M,_top:N}
|
||||||
|
;throw t}}function x(e,t){t=t||p.languages||Object.keys(i);const n=(e=>{
|
||||||
|
const t={value:Y(e),illegal:!1,relevance:0,_top:l,_emitter:new p.__emitter(p)}
|
||||||
|
;return t._emitter.addText(e),t})(e),s=t.filter(O).filter(k).map((t=>E(t,e,!1)))
|
||||||
|
;s.unshift(n);const o=s.sort(((e,t)=>{
|
||||||
|
if(e.relevance!==t.relevance)return t.relevance-e.relevance
|
||||||
|
;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1
|
||||||
|
;if(O(t.language).supersetOf===e.language)return-1}return 0})),[r,a]=o,c=r
|
||||||
|
;return c.secondBest=a,c}function w(e){let t=null;const n=(e=>{
|
||||||
|
let t=e.className+" ";t+=e.parentNode?e.parentNode.className:""
|
||||||
|
;const n=p.languageDetectRe.exec(t);if(n){const t=O(n[1])
|
||||||
|
;return t||(X(a.replace("{}",n[1])),
|
||||||
|
X("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"}
|
||||||
|
return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return
|
||||||
|
;if(N("before:highlightElement",{el:e,language:n
|
||||||
|
}),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e)
|
||||||
|
;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),
|
||||||
|
console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),
|
||||||
|
console.warn("The element with unescaped HTML:"),
|
||||||
|
console.warn(e)),p.throwUnescapedHTML))throw new J("One of your code blocks includes unescaped HTML.",e.innerHTML)
|
||||||
|
;t=e;const i=t.textContent,o=n?m(i,{language:n,ignoreIllegals:!0}):x(i)
|
||||||
|
;e.innerHTML=o.value,e.dataset.highlighted="yes",((e,t,n)=>{const i=t&&s[t]||n
|
||||||
|
;e.classList.add("hljs"),e.classList.add("language-"+i)
|
||||||
|
})(e,n,o.language),e.result={language:o.language,re:o.relevance,
|
||||||
|
relevance:o.relevance},o.secondBest&&(e.secondBest={
|
||||||
|
language:o.secondBest.language,relevance:o.secondBest.relevance
|
||||||
|
}),N("after:highlightElement",{el:e,result:o,text:i})}let y=!1;function _(){
|
||||||
|
"loading"!==document.readyState?document.querySelectorAll(p.cssSelector).forEach(w):y=!0
|
||||||
|
}function O(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}
|
||||||
|
function v(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{
|
||||||
|
s[e.toLowerCase()]=t}))}function k(e){const t=O(e)
|
||||||
|
;return t&&!t.disableAutodetect}function N(e,t){const n=e;o.forEach((e=>{
|
||||||
|
e[n]&&e[n](t)}))}
|
||||||
|
"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{
|
||||||
|
y&&_()}),!1),Object.assign(n,{highlight:m,highlightAuto:x,highlightAll:_,
|
||||||
|
highlightElement:w,
|
||||||
|
highlightBlock:e=>(G("10.7.0","highlightBlock will be removed entirely in v12.0"),
|
||||||
|
G("10.7.0","Please use highlightElement now."),w(e)),configure:e=>{p=Q(p,e)},
|
||||||
|
initHighlighting:()=>{
|
||||||
|
_(),G("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")},
|
||||||
|
initHighlightingOnLoad:()=>{
|
||||||
|
_(),G("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")
|
||||||
|
},registerLanguage:(e,t)=>{let s=null;try{s=t(n)}catch(t){
|
||||||
|
if(W("Language definition for '{}' could not be registered.".replace("{}",e)),
|
||||||
|
!r)throw t;W(t),s=l}
|
||||||
|
s.name||(s.name=e),i[e]=s,s.rawDefinition=t.bind(null,n),s.aliases&&v(s.aliases,{
|
||||||
|
languageName:e})},unregisterLanguage:e=>{delete i[e]
|
||||||
|
;for(const t of Object.keys(s))s[t]===e&&delete s[t]},
|
||||||
|
listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:v,
|
||||||
|
autoDetection:k,inherit:Q,addPlugin:e=>{(e=>{
|
||||||
|
e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{
|
||||||
|
e["before:highlightBlock"](Object.assign({block:t.el},t))
|
||||||
|
}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{
|
||||||
|
e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),o.push(e)},
|
||||||
|
removePlugin:e=>{const t=o.indexOf(e);-1!==t&&o.splice(t,1)}}),n.debugMode=()=>{
|
||||||
|
r=!1},n.safeMode=()=>{r=!0},n.versionString="11.9.0",n.regex={concat:h,
|
||||||
|
lookahead:g,either:f,optional:d,anyNumberOfTimes:u}
|
||||||
|
;for(const t in j)"object"==typeof j[t]&&e(j[t]);return Object.assign(n,j),n
|
||||||
|
},ne=te({});return ne.newInstance=()=>te({}),ne}()
|
||||||
|
;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);/*! `c` grammar compiled for Highlight.js 11.9.0 */
|
||||||
|
(()=>{var e=(()=>{"use strict";return e=>{const n=e.regex,t=e.COMMENT("//","$",{
|
||||||
|
contains:[{begin:/\\\n/}]
|
||||||
|
}),s="decltype\\(auto\\)",a="[a-zA-Z_]\\w*::",r="("+s+"|"+n.optional(a)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",i={
|
||||||
|
className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{
|
||||||
|
match:/\batomic_[a-z]{3,6}\b/}]},l={className:"string",variants:[{
|
||||||
|
begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{
|
||||||
|
begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",
|
||||||
|
end:"'",illegal:"."},e.END_SAME_AS_BEGIN({
|
||||||
|
begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={
|
||||||
|
className:"number",variants:[{begin:"\\b(0b[01']+)"},{
|
||||||
|
begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"
|
||||||
|
},{
|
||||||
|
begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"
|
||||||
|
}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{
|
||||||
|
keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"
|
||||||
|
},contains:[{begin:/\\\n/,relevance:0},e.inherit(l,{className:"string"}),{
|
||||||
|
className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={
|
||||||
|
className:"title",begin:n.optional(a)+e.IDENT_RE,relevance:0
|
||||||
|
},g=n.optional(a)+e.IDENT_RE+"\\s*\\(",u={
|
||||||
|
keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"],
|
||||||
|
type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"],
|
||||||
|
literal:"true false NULL",
|
||||||
|
built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr"
|
||||||
|
},m=[c,i,t,e.C_BLOCK_COMMENT_MODE,o,l],_={variants:[{begin:/=/,end:/;/},{
|
||||||
|
begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],
|
||||||
|
keywords:u,contains:m.concat([{begin:/\(/,end:/\)/,keywords:u,
|
||||||
|
contains:m.concat(["self"]),relevance:0}]),relevance:0},p={
|
||||||
|
begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,
|
||||||
|
keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:s,keywords:u,relevance:0},{
|
||||||
|
begin:g,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})],
|
||||||
|
relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,
|
||||||
|
keywords:u,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,l,o,i,{begin:/\(/,
|
||||||
|
end:/\)/,keywords:u,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,l,o,i]
|
||||||
|
}]},i,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u,
|
||||||
|
disableAutodetect:!0,illegal:"</",contains:[].concat(_,p,m,[c,{
|
||||||
|
begin:e.IDENT_RE+"::",keywords:u},{className:"class",
|
||||||
|
beginKeywords:"enum class struct union",end:/[{;:<>=]/,contains:[{
|
||||||
|
beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c,
|
||||||
|
strings:l,keywords:u}}}})();hljs.registerLanguage("c",e)})();
|
|
@ -7,8 +7,9 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<script src="codapi.js"></script>
|
<script src="codapi.js"></script>
|
||||||
<script src="codapi-settings.js"></script>
|
<script src="codapi-settings.js"></script>
|
||||||
|
<script src="highlight.min.js"></script>
|
||||||
<link rel="stylesheet" href="codapi.css" />
|
<link rel="stylesheet" href="codapi.css" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/styles/github.min.css" />
|
<link rel="stylesheet" href="github.min.css" />
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
||||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||||
|
@ -24,6 +25,7 @@
|
||||||
line-height: 1.35;
|
line-height: 1.35;
|
||||||
color: #008bf5;
|
color: #008bf5;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
codapi-toolbar button::after {
|
codapi-toolbar button::after {
|
||||||
content: " ▶";
|
content: " ▶";
|
||||||
|
@ -41,7 +43,8 @@
|
||||||
font-family: 'Source Code Pro', monospace;
|
font-family: 'Source Code Pro', monospace;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
height: 340px;
|
min-height: 340px;
|
||||||
|
max-height: 500px;
|
||||||
letter-spacing: normal;
|
letter-spacing: normal;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
|
@ -69,70 +72,11 @@
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<codapi-settings url="https://hare-exec.fly.dev/v1"></codapi-settings>
|
|
||||||
|
|
||||||
<div class="editor language-c"></div>
|
<div class="editor language-c"></div>
|
||||||
|
|
||||||
<codapi-snippet sandbox="hare" editor="external" selector=".editor">
|
<codapi-settings url="https://hare-exec.fly.dev/v1"></codapi-settings>
|
||||||
<button class="share">Share</button>
|
<codapi-snippet sandbox="hare" editor="external" selector=".editor"></codapi-snippet>
|
||||||
</codapi-snippet>
|
|
||||||
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/highlight.min.js"></script>
|
<script type="module" src="app.js"></script>
|
||||||
<script type="module">
|
|
||||||
import {CodeJar} from "./codejar.js"
|
|
||||||
const highlight = editor => {
|
|
||||||
editor.textContent = editor.textContent
|
|
||||||
hljs.highlightBlock(editor)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function base64ToBytes(base64) {
|
|
||||||
const binString = atob(base64);
|
|
||||||
return Uint8Array.from(binString, (m) => m.codePointAt(0));
|
|
||||||
}
|
|
||||||
function base64Encode(str) {
|
|
||||||
return bytesToBase64(new TextEncoder().encode(str));
|
|
||||||
}
|
|
||||||
|
|
||||||
function bytesToBase64(bytes) {
|
|
||||||
const binString = Array.from(bytes, (byte) =>
|
|
||||||
String.fromCodePoint(byte),
|
|
||||||
).join("");
|
|
||||||
return btoa(binString);
|
|
||||||
}
|
|
||||||
function base64Decode(bytes) {
|
|
||||||
return new TextDecoder().decode(base64ToBytes(bytes));
|
|
||||||
}
|
|
||||||
|
|
||||||
let jar = CodeJar(document.querySelector('.editor'), highlight)
|
|
||||||
const defaultCode = `use fmt;
|
|
||||||
|
|
||||||
export fn main() void = {
|
|
||||||
const greetings = [
|
|
||||||
"Hello, world!",
|
|
||||||
"¡Hola Mundo!",
|
|
||||||
"Γειά σου Κόσμε!",
|
|
||||||
"Привіт, світ!",
|
|
||||||
"こんにちは世界!",
|
|
||||||
];
|
|
||||||
for (let i = 0z; i < len(greetings); i+= 1) {
|
|
||||||
fmt::println(greetings[i])!;
|
|
||||||
};
|
|
||||||
};`
|
|
||||||
|
|
||||||
if (location.hash) {
|
|
||||||
let code = base64Decode(location.hash.substr(1));
|
|
||||||
jar.updateCode(code)
|
|
||||||
} else {
|
|
||||||
location.hash = base64Encode(defaultCode);
|
|
||||||
jar.updateCode(defaultCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
document.getElementsByClassName("share")[0].onclick = (e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
let code = document.querySelector('.editor').innerText;
|
|
||||||
location.hash = base64Encode(code);
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
Loading…
Reference in a new issue