140 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			140 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
|  | <!DOCTYPE html charset="UTF-8"> | ||
|  | <html> | ||
|  | 
 | ||
|  | <head> | ||
|  | <meta charset="UTF-8"> | ||
|  | <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.2.0/build/styles/default.min.css"> | ||
|  | <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.2.0/build/highlight.min.js"></script> | ||
|  | <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> | ||
|  | <script> | ||
|  | class Content { | ||
|  |     content = ""; | ||
|  |     type = ""; | ||
|  |     metaData = {} | ||
|  | 
 | ||
|  |     constructor(content, type, metaData = {}) | ||
|  |     { | ||
|  |         this.content = content; | ||
|  |         this.type = type; | ||
|  |         this.metaData = metaData; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | class Index  | ||
|  | { | ||
|  |     mimeType = ""; | ||
|  |     chunks = 0; | ||
|  |     hash = ""; | ||
|  |     metaData = {}; | ||
|  | 
 | ||
|  |     constructor(mimeType, chunks, hash, metaData = {}) | ||
|  |     { | ||
|  |         this.mimeType = mimeType; | ||
|  |         this.chunks = chunks; | ||
|  |         this.hash = hash; | ||
|  |         this.metaData = metaData | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | const dohServer = "https://cloudflare-dns.com/dns-query?ct=application/dns-json&type=TXT&name="; | ||
|  | const baseDomain = "hod.experiments.jacobkiers.net"; | ||
|  | 
 | ||
|  | async function readUrl(domain) { | ||
|  |     var index = await fetchIndex(`${dohServer}${domain}.${baseDomain}`); | ||
|  | 
 | ||
|  |     var chunk_promises = []; | ||
|  |     for(i = 0; i < index.chunks; i++) | ||
|  |     { | ||
|  |         chunk_promises[i] = fetchChunk(i, index.hash); | ||
|  |     } | ||
|  | 
 | ||
|  |     var chunks = await Promise.all(chunk_promises); | ||
|  |     var content = chunks.reduce((built, current) => built += current); | ||
|  | 
 | ||
|  |     return handleContent(new Content(atob(content), index.mimeType, index.metaData)); | ||
|  | } | ||
|  | 
 | ||
|  | async function fetchChunk(id, hash) | ||
|  | { | ||
|  |     var domain = `${id}.${hash}.${baseDomain}`; | ||
|  |     const json = await fetch(`${dohServer}${domain}`) | ||
|  |         .then(response => response.json()); | ||
|  | 
 | ||
|  |     const data = json.Answer[0].data.slice(1, -1); | ||
|  | 
 | ||
|  |     return data; | ||
|  | } | ||
|  | 
 | ||
|  | async function fetchIndex(domain) | ||
|  | { | ||
|  |     const response = await fetch(`${dohServer}.${domain}`); | ||
|  |     const json = await response.json(); | ||
|  |     const index = json.Answer[0].data.slice(1, -1); | ||
|  |      | ||
|  |     let ret = {}; | ||
|  |     let items = index.split(';'); | ||
|  |     items.forEach(item => { | ||
|  |         let md = item.split('='); | ||
|  |         let key = md[0]; | ||
|  |         let value = md[1]; | ||
|  | 
 | ||
|  |         ret[key] = value; | ||
|  |     }); | ||
|  | 
 | ||
|  |     const metadata = JSON.parse(atob(ret["m"])); | ||
|  |     return new Index(ret["t"], ret["c"], ret["h"], metadata); | ||
|  | } | ||
|  | 
 | ||
|  | function handleContent(content) | ||
|  | { | ||
|  |     if (!content instanceof Content) { | ||
|  |         console.log("Not valid content in handleContent.") | ||
|  |         return; | ||
|  |     } | ||
|  | 
 | ||
|  |     switch(content.type) | ||
|  |     { | ||
|  |         case "text/javascript": | ||
|  |             return handleJavascript(content); | ||
|  |          | ||
|  |         case "text/markdown": | ||
|  |             return handleMarkdown(content); | ||
|  | 
 | ||
|  |         default: | ||
|  |             console.log(`handleContent() does not know how to parse ${content.type}`); | ||
|  |             break; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function handleJavascript(content) | ||
|  | { | ||
|  |     console.log("Got some javascript!", content.content); | ||
|  | } | ||
|  | 
 | ||
|  | async function handleMarkdown(content) | ||
|  | { | ||
|  |     console.log("Got me some markdown!"); | ||
|  |     marked.setOptions({ | ||
|  |         highlight: function(code, lang) { | ||
|  |             return hljs.highlight(lang, code).value; | ||
|  |         }, | ||
|  |         // langPrefix: '' | ||
|  |     }); | ||
|  | 
 | ||
|  |     if (content.metaData.title != undefined) document.title = content.metaData.title; | ||
|  |     document.getElementById("post").innerHTML = marked(content.content); | ||
|  |     let title = document.createElement("h1"); | ||
|  |     title.innerHTML = content.metaData.title; | ||
|  |     document.getElementById("post").prepend(title) | ||
|  | } | ||
|  | </script> | ||
|  | </head> | ||
|  | <body> | ||
|  |   <script> | ||
|  | readUrl("posts-2015-01-24-multiple-return-values-with-mockery-md"); | ||
|  | 
 | ||
|  |   </script> | ||
|  |   <div id="post"></div> | ||
|  | </body> | ||
|  | 
 | ||
|  | </html> |