.gitea
apps
admin
api
apps
blog
db
follow
identity
intro
issues
app.js
commonmark-linkify.js
commonmark.min.js
index.html
lit-all.min.js
lit-all.min.js.map
script.js
tf-utils.js
journal
room
sneaker
ssb
storage
test
todo
web
welcome
wiki
admin.json
api.json
apps.json
blog.json
db.json
follow.json
identity.json
intro.json
issues.json
journal.json
room.json
sneaker.json
ssb.json
storage.json
test.json
todo.json
web.json
welcome.json
wiki.json
core
deps
docs
metadata
src
tools
.clang-format
.dockerignore
.git-blame-ignore-revs
.gitignore
.gitmodules
.prettierignore
.prettierrc.yaml
CONTRIBUTING.md
Dockerfile
Doxyfile
GNUmakefile
LICENSE
README.md
default.nix
flake.lock
flake.nix
package-lock.json
package.json
120 lines
3.0 KiB
JavaScript
120 lines
3.0 KiB
JavaScript
import * as linkify from './commonmark-linkify.js';
|
|
|
|
var reUnsafeProtocol = /^javascript:|vbscript:|file:|data:/i;
|
|
var reSafeDataProtocol = /^data:image\/(?:png|gif|jpeg|webp)/i;
|
|
var potentiallyUnsafe = function (url) {
|
|
return reUnsafeProtocol.test(url) && !reSafeDataProtocol.test(url);
|
|
};
|
|
|
|
function image(node, entering) {
|
|
if (
|
|
node.firstChild?.type === 'text' &&
|
|
node.firstChild.literal.startsWith('video:')
|
|
) {
|
|
if (entering) {
|
|
this.lit(
|
|
'<video style="max-width: 100%; max-height: 480px" title="' +
|
|
this.esc(node.firstChild?.literal) +
|
|
'" controls>'
|
|
);
|
|
this.lit('<source src="' + this.esc(node.destination) + '"></source>');
|
|
this.disableTags += 1;
|
|
} else {
|
|
this.disableTags -= 1;
|
|
this.lit('</video>');
|
|
}
|
|
} else if (
|
|
node.firstChild?.type === 'text' &&
|
|
node.firstChild.literal.startsWith('audio:')
|
|
) {
|
|
if (entering) {
|
|
this.lit(
|
|
'<audio style="height: 32px; max-width: 100%" title="' +
|
|
this.esc(node.firstChild?.literal) +
|
|
'" controls>'
|
|
);
|
|
this.lit('<source src="' + this.esc(node.destination) + '"></source>');
|
|
this.disableTags += 1;
|
|
} else {
|
|
this.disableTags -= 1;
|
|
this.lit('</audio>');
|
|
}
|
|
} else {
|
|
if (entering) {
|
|
if (this.disableTags === 0) {
|
|
this.lit(
|
|
'<div class="img_caption">' +
|
|
this.esc(node.firstChild?.literal || node.destination) +
|
|
'</div>'
|
|
);
|
|
if (this.options.safe && potentiallyUnsafe(node.destination)) {
|
|
this.lit('<img src="" alt="');
|
|
} else {
|
|
this.lit('<img src="' + this.esc(node.destination) + '" alt="');
|
|
}
|
|
}
|
|
this.disableTags += 1;
|
|
} else {
|
|
this.disableTags -= 1;
|
|
if (this.disableTags === 0) {
|
|
if (node.title) {
|
|
this.lit('" title="' + this.esc(node.title));
|
|
}
|
|
this.lit('" />');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export function markdown(md) {
|
|
var reader = new commonmark.Parser();
|
|
var writer = new commonmark.HtmlRenderer({safe: true});
|
|
writer.image = image;
|
|
var parsed = reader.parse(md || '');
|
|
parsed = linkify.transform(parsed);
|
|
var walker = parsed.walker();
|
|
var event, node;
|
|
while ((event = walker.next())) {
|
|
node = event.node;
|
|
if (event.entering) {
|
|
if (node.type == 'link') {
|
|
if (
|
|
node.destination.startsWith('@') &&
|
|
node.destination.endsWith('.ed25519')
|
|
) {
|
|
node.destination = '#' + node.destination;
|
|
} else if (
|
|
node.destination.startsWith('%') &&
|
|
node.destination.endsWith('.sha256')
|
|
) {
|
|
node.destination = '#' + node.destination;
|
|
} else if (
|
|
node.destination.startsWith('&') &&
|
|
node.destination.endsWith('.sha256')
|
|
) {
|
|
node.destination = '/' + node.destination + '/view';
|
|
}
|
|
} else if (node.type == 'image') {
|
|
if (node.destination.startsWith('&')) {
|
|
node.destination = '/' + node.destination + '/view';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return writer.render(parsed);
|
|
}
|
|
|
|
export function human_readable_size(bytes) {
|
|
let v = bytes;
|
|
let u = 'B';
|
|
for (let unit of ['kB', 'MB', 'GB']) {
|
|
if (v > 1024) {
|
|
v /= 1024;
|
|
u = unit;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
return `${Math.round(v * 10) / 10} ${u}`;
|
|
}
|