58 lines
2.5 KiB
HTML
58 lines
2.5 KiB
HTML
@include(snippets/header)
|
|
<div class="pagewrapper">
|
|
<div id="main">
|
|
<div class="rules">
|
|
@if(about_text)
|
|
<div class="dynamic-page-content" id="about-dynamic-content"></div>
|
|
<script id="about-raw-data" type="application/json">{{ about_text_b64 }}</script>
|
|
<script>
|
|
(function() {
|
|
var raw = document.getElementById('about-raw-data');
|
|
var el = document.getElementById('about-dynamic-content');
|
|
function escapeHtml(str) {
|
|
return str.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/'/g,''');
|
|
}
|
|
function sanitizeHtml(html) {
|
|
var tmp = document.createElement('div');
|
|
tmp.innerHTML = html;
|
|
tmp.querySelectorAll('script,iframe,object,embed,form,input,button,select,meta,link,base,style').forEach(function(el) { el.remove(); });
|
|
tmp.querySelectorAll('*').forEach(function(node) {
|
|
Array.from(node.attributes).forEach(function(attr) {
|
|
if (/^on/i.test(attr.name) || (attr.name === 'href' && /^javascript:/i.test(attr.value.trim()))) {
|
|
node.removeAttribute(attr.name);
|
|
}
|
|
});
|
|
});
|
|
return tmp.innerHTML;
|
|
}
|
|
function render() {
|
|
if (raw && el && typeof marked !== 'undefined') {
|
|
var bytes = Uint8Array.from(atob(raw.textContent.trim()), function(c) { return c.charCodeAt(0); });
|
|
var text = new TextDecoder('utf-8').decode(bytes);
|
|
var renderer = new marked.Renderer();
|
|
renderer.code = function(code, lang) {
|
|
var escaped = escapeHtml(typeof code === 'object' ? (code.text || '') : code);
|
|
var langAttr = (typeof code === 'object' ? code.lang : lang) || '';
|
|
return '<pre><code' + (langAttr ? ' class="language-' + escapeHtml(langAttr) + '"' : '') + '>' + escaped + '</code></pre>';
|
|
};
|
|
renderer.codespan = function(code) {
|
|
var escaped = escapeHtml(typeof code === 'object' ? (code.text || '') : code);
|
|
return '<code>' + escaped + '</code>';
|
|
};
|
|
el.innerHTML = sanitizeHtml(marked.parse(text, { gfm: true, breaks: true, renderer: renderer }));
|
|
}
|
|
}
|
|
if (typeof marked !== 'undefined') {
|
|
render();
|
|
} else {
|
|
document.addEventListener('DOMContentLoaded', render);
|
|
}
|
|
})();
|
|
</script>
|
|
@else
|
|
<h1>About</h1>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@include(snippets/footer) |