import { h, inject, defineComponent, ref, createTextVNode, type VNode } from 'vue'; import { RouterLink } from 'vue-router'; import useAsyncState from "@/useAsyncState.ts"; export default defineComponent({ name: 'ge-deutsch-article', props: { articleName: { type: String, required: true, }, }, async setup(props) { const currentLang = ref<"en" | "de">("de"); function clickBtn() { currentLang.value = currentLang.value === "en" ? "de" : "en"; } const parseDom = inject('dom-parse', (innerHTML: string) => Object.assign(document.createElement('div'), { innerHTML })); const { result: articleContent, stateIsReady } = useAsyncState('ge-deutsch-article-data', async ({ hostUrl }) => { const articleResponse = await fetch(`${ hostUrl }/generative-energy/static/content/${ props.articleName }.html`); return await articleResponse.text(); }); function transformArticleNode(node: Node): VNode | string { if (node.nodeType === node.ELEMENT_NODE) { const el = node as Element; const attrs: Record = {}; const children = [...node.childNodes].map(_ => transformArticleNode(_)); if (el.tagName === 'P') { el.classList.add('text-slab'); children.unshift(h('button', { class: 'swap', onClick: (e) => { e.target.parentElement.classList.toggle('swap'); } }, '↻')); } for (let i = 0; i < el.attributes.length; i++) { const item = el.attributes.item(i); if (item) { attrs[item.name] = item.value; } } return h((node as Element).tagName, attrs, children); } else { return createTextVNode(node.textContent ?? ''); } } function ArticleContentTransformed() { if (articleContent.value) { const dom = parseDom(articleContent.value); return h('div', {}, [...dom.children].map(_ => transformArticleNode(_))); } return
Artikel lädt...
; } await stateIsReady; return () =>
Zur Artikelübersicht
; } });