diff options
Diffstat (limited to 'xP')
-rw-r--r-- | xP/public/xP.css | 10 | ||||
-rw-r--r-- | xP/public/xP.js | 23 |
2 files changed, 25 insertions, 8 deletions
diff --git a/xP/public/xP.css b/xP/public/xP.css index 3aaff10..8b67844 100644 --- a/xP/public/xP.css +++ b/xP/public/xP.css @@ -86,19 +86,19 @@ body { padding: .1rem .3rem; white-space: pre-wrap; } -.content span.b { +.content .b { font-weight: bold; } -.content span.i { +.content .i { font-style: italic; } -.content span.u { +.content .u { text-decoration: underline; } -.content span.s { +.content .s { text-decoration: line-through; } -.content span.m { +.content .m { font-family: monospace; } diff --git a/xP/public/xP.js b/xP/public/xP.js index 13507d6..c0dba93 100644 --- a/xP/public/xP.js +++ b/xP/public/xP.js @@ -115,6 +115,24 @@ let BufferList = { }, } +function linkify(text, attrs, a) { + let re = new RegExp([ + /https?:\/\//, + /([^\[\](){}<>"'\s]|\([^\[\](){}<>"'\s]*\))+/, + /[^\[\](){}<>"'\s,.:]/, + ].map(r => r.source).join(''), 'g') + + let end = 0, match + while ((match = re.exec(text)) !== null) { + if (end < match.index) + a.push(m('span', attrs, text.substring(end, match.index))) + a.push(m('a', {href: match[0], ...attrs}, match[0])) + end = re.lastIndex + } + if (end < text.length) + a.push(m('span', attrs, text.substring(end))) +} + let Content = { view: vnode => { let line = vnode.children[0] @@ -139,11 +157,10 @@ let Content = { line.items.forEach(item => { switch (item.kind) { case 'Text': - // TODO: Detect and transform links. - content.push(m('span', { + linkify(item.text, { class: Array.from(classes.keys()).join(' '), style: applyColor(fg, bg, inverse), - }, item.text)) + }, content) break case 'Reset': classes.clear() |