2023-07-27 07:31:52 +02:00
|
|
|
/*
|
|
|
|
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
|
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
*/
|
|
|
|
|
2023-05-14 05:23:39 +02:00
|
|
|
import { h } from 'vue';
|
2020-12-26 02:01:32 +01:00
|
|
|
|
2023-05-14 05:23:39 +02:00
|
|
|
export default function(props: { src: string; tag?: string; textTag?: string; }, { slots }) {
|
|
|
|
let str = props.src;
|
|
|
|
const parsed = [] as (string | { arg: string; })[];
|
|
|
|
while (true) {
|
|
|
|
const nextBracketOpen = str.indexOf('{');
|
|
|
|
const nextBracketClose = str.indexOf('}');
|
2020-12-26 02:47:36 +01:00
|
|
|
|
2023-05-14 05:23:39 +02:00
|
|
|
if (nextBracketOpen === -1) {
|
|
|
|
parsed.push(str);
|
|
|
|
break;
|
|
|
|
} else {
|
2023-07-14 00:59:54 +02:00
|
|
|
if (nextBracketOpen > 0) parsed.push(str.substring(0, nextBracketOpen));
|
2023-05-14 05:23:39 +02:00
|
|
|
parsed.push({
|
|
|
|
arg: str.substring(nextBracketOpen + 1, nextBracketClose),
|
|
|
|
});
|
2020-12-26 02:47:36 +01:00
|
|
|
}
|
|
|
|
|
2023-07-14 00:59:54 +02:00
|
|
|
str = str.substring(nextBracketClose + 1);
|
2023-05-14 05:23:39 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return h(props.tag ?? 'span', parsed.map(x => typeof x === 'string' ? (props.textTag ? h(props.textTag, x) : x) : slots[x.arg]()));
|
|
|
|
}
|