This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Zaimki/components/LinkedText.vue

111 lines
3.4 KiB
Vue
Raw Normal View History

2020-09-28 05:14:00 -07:00
<script>
import Icon from './Icon';
2021-02-01 12:03:30 -08:00
import spelling from "../plugins/spelling";
2020-09-28 05:14:00 -07:00
export default {
2021-02-01 12:03:30 -08:00
mixins: [ spelling ],
2020-09-28 05:14:00 -07:00
props: {
text: { required: true },
noicons: { type: Boolean },
2020-09-28 05:14:00 -07:00
},
render(h) {
if (!this.text) {
return h('span');
}
2020-09-28 05:14:00 -07:00
let isLink = false;
let isIcon = false;
let isEscape = false;
2020-09-28 05:14:00 -07:00
let buffer = '';
let linkBuffer = '';
const children = [];
const buildLink = _ => {
if (isIcon) {
2020-12-30 06:33:26 -08:00
return h(Icon, {props: { v: buffer }});
}
const bufferNode = [ h('span', {domProps: { innerHTML: this.handleSpelling(buffer) }}) ];
2020-09-28 05:14:00 -07:00
if (!isLink) {
return bufferNode;
2020-09-28 05:14:00 -07:00
}
if (linkBuffer === '') {
linkBuffer = '#' + buffer;
}
if (linkBuffer.indexOf('https://') === 0
|| linkBuffer.indexOf('http://') === 0
|| linkBuffer.indexOf('mailto:') === 0
) {
2020-09-28 05:14:00 -07:00
return h(
'a',
{domProps: {href: linkBuffer, target: '_blank', rel: 'noopener'}},
bufferNode,
);
}
if (linkBuffer.indexOf('#') === 0) {
return h(
'a',
{domProps: {href: linkBuffer}},
bufferNode,
);
2020-09-28 05:14:00 -07:00
}
return h('nuxt-link', {props: { to: linkBuffer || '/' + this.config.nouns.route + '#' + this.handleSpelling(buffer) }}, bufferNode);
2020-09-28 05:14:00 -07:00
}
const addChild = _ => {
if (!buffer) {
return;
}
children.push(buildLink());
buffer = '';
linkBuffer = '';
}
for (let c of this.text) {
if (c === '{') {
addChild();
isLink = true;
continue;
} else if (c === '}') {
addChild();
isLink = false;
continue;
} else if (isLink && c === '=') {
2020-10-10 09:31:31 -07:00
if (linkBuffer) {
linkBuffer += '='
}
linkBuffer += buffer;
2020-09-28 05:14:00 -07:00
buffer = '';
continue;
} else if (c === '[' && !this.noicons) {
addChild();
if (isEscape) {
isEscape = false;
} else {
isIcon = true;
continue;
}
} else if (c === ']' && !this.noicons) {
addChild();
if (isIcon) {
isIcon = false;
continue;
}
} else if (c === '\\') {
isEscape = true;
continue;
} else if (isEscape) {
buffer += '\\';
isEscape = false;
2020-09-28 05:14:00 -07:00
}
buffer += c;
}
addChild();
return h('span', children);
},
}
</script>