Skip to content

Commit b5413b3

Browse files
committed
refactor to CompositionAPI...
fixed a circular reference typescipt complain - the component is recursive
1 parent 76c5987 commit b5413b3

File tree

1 file changed

+92
-84
lines changed

1 file changed

+92
-84
lines changed

packages/vue/src/base-course/Components/MdTokenRenderer.vue

Lines changed: 92 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@
9292

9393
<span v-else-if="token.type === 'html'" v-html="token.raw"></span>
9494

95-
<highlightjs v-else-if="token.type === 'code'" class="hljs_render pa-2" :language="token.lang" :code="token.text" />
95+
<code-block-renderer v-else-if="token.type === 'code'" :code="token.text" :language="token.lang" />
96+
<!-- <highlightjs v-else-if="token.type === 'code'" class="hljs_render pa-2" :language="token.lang" :code="token.text" /> -->
9697

9798
<code v-else-if="token.type === 'codespan'" class="codespan" v-html="token.text"></code>
9899

@@ -107,99 +108,106 @@
107108
</em>
108109
</template>
109110

110-
<script lang="ts">
111+
<script setup lang="ts">
111112
import RadioMultipleChoice from '@/base-course/Components/RadioMultipleChoice.vue';
112113
import {
113-
containsComponent,
114-
isComponent,
115-
splitParagraphToken,
116-
splitTextToken,
114+
containsComponent as _containsComponent,
115+
isComponent as _isComponent,
116+
splitParagraphToken as _splitParagraphToken,
117+
splitTextToken as _splitTextToken,
117118
TokenOrComponent,
118119
} from '@/courses/default/questions/fillIn';
120+
import CodeBlockRenderer from './CodeBlockRenderer.vue';
119121
import FillInInput from '@/courses/default/questions/fillIn/fillInInput.vue';
120-
import { marked } from 'marked';
121-
import { defineComponent } from 'vue';
122+
import { MarkedToken, Tokens } from 'marked';
122123
123-
// import hljs from 'highlight.js';
124-
// import 'highlight.js/styles/atelier-seaside-light.css'; // Move CSS import here
125-
// import 'highlight.js/styles/atelier-seaside-light.css';
126-
import hljsVuePlugin from '@highlightjs/vue-plugin';
124+
// Define component props
125+
const props = defineProps({
126+
token: {
127+
type: Object as any, // We'll fix the typing later
128+
required: true,
129+
},
130+
last: {
131+
type: Boolean,
132+
required: false,
133+
default: false,
134+
},
135+
});
127136
128-
export default defineComponent({
129-
name: 'MdTokenRenderer',
137+
// Register components for runtime use
138+
const components = {
139+
fillIn: FillInInput,
140+
RadioMultipleChoice,
141+
};
130142
131-
components: {
132-
fillIn: FillInInput,
133-
RadioMultipleChoice,
134-
highlightjs: hljsVuePlugin.component,
135-
},
143+
// Methods
144+
function isComponent(token: MarkedToken): boolean {
145+
return _isComponent(token);
146+
}
136147
137-
props: {
138-
token: {
139-
type: Object as () => marked.Token | TokenOrComponent,
140-
required: true,
141-
},
142-
last: {
143-
type: Boolean,
144-
required: false,
145-
default: false,
146-
},
147-
},
148+
function containsComponent(token: MarkedToken): boolean {
149+
return _containsComponent(token);
150+
}
148151
149-
methods: {
150-
isComponent(token: marked.Token): boolean {
151-
return isComponent(token);
152-
},
153-
154-
containsComponent(token: marked.Token): boolean {
155-
return containsComponent(token);
156-
},
157-
158-
splitTextToken(token: marked.Tokens.Text): marked.Token[] {
159-
return splitTextToken(token);
160-
},
161-
162-
splitParagraphToken(token: marked.Tokens.Paragraph): TokenOrComponent[] {
163-
return splitParagraphToken(token);
164-
},
165-
166-
parsedComponent(
167-
token: marked.Tokens.Text
168-
): {
169-
is: string;
170-
text: string;
171-
} {
172-
// [ ] switching on component types & loading custom component
173-
//
174-
// sketch:
175-
// const demoustached = token.text.slice(2, token.text.length - 2);
176-
// const firstToken = demoustached.split(' ')[0];
177-
// if (firstToken.charAt(firstToken.length - 1) == '>') {
178-
// return {
179-
// is: firstToken.slice(0, firstToken.length - 1),
180-
// text: demoustached.slice(firstToken.length + 1, demoustached.length),
181-
// };
182-
// }
183-
184-
return {
185-
is: 'fillIn',
186-
text: token.text,
187-
};
188-
},
189-
190-
decodeBasicEntities(text: string): string {
191-
return text
192-
.replace(/&#39;/g, "'")
193-
.replace(/&quot;/g, '"')
194-
.replace(/&amp;/g, '&')
195-
.replace(/&lt;/g, '<')
196-
.replace(/&gt;/g, '>');
197-
},
198-
199-
isText(tok: TokenOrComponent): tok is marked.Tokens.Text {
200-
return (tok as marked.Tokens.Tag).inLink === undefined && tok.type === 'text';
201-
},
202-
},
152+
function splitTextToken(token: MarkedToken): Tokens.Text[] {
153+
return _splitTextToken(token);
154+
}
155+
156+
function splitParagraphToken(token: Tokens.Paragraph): TokenOrComponent[] {
157+
return _splitParagraphToken(token);
158+
}
159+
160+
function parsedComponent(token: MarkedToken): {
161+
is: string;
162+
text: string;
163+
} {
164+
// [ ] switching on component types & loading custom component
165+
//
166+
// sketch:
167+
// const demoustached = token.text.slice(2, token.text.length - 2);
168+
// const firstToken = demoustached.split(' ')[0];
169+
// if (firstToken.charAt(firstToken.length - 1) == '>') {
170+
// return {
171+
// is: firstToken.slice(0, firstToken.length - 1),
172+
// text: demoustached.slice(firstToken.length + 1, demoustached.length),
173+
// };
174+
// }
175+
176+
let text = '';
177+
if ('text' in token && typeof token.text === 'string') {
178+
text = token.text;
179+
} else if ('raw' in token && typeof token.raw === 'string') {
180+
text = token.raw;
181+
}
182+
183+
return {
184+
is: 'fillIn',
185+
text,
186+
};
187+
}
188+
189+
function decodeBasicEntities(text: string): string {
190+
return text
191+
.replace(/&#39;/g, "'")
192+
.replace(/&quot;/g, '"')
193+
.replace(/&amp;/g, '&')
194+
.replace(/&lt;/g, '<')
195+
.replace(/&gt;/g, '>');
196+
}
197+
198+
function isText(tok: TokenOrComponent): boolean {
199+
return (tok as any).inLink === undefined && tok.type === 'text';
200+
}
201+
202+
// Make these functions available to the template
203+
defineExpose({
204+
isComponent,
205+
containsComponent,
206+
splitTextToken,
207+
splitParagraphToken,
208+
parsedComponent,
209+
decodeBasicEntities,
210+
isText,
203211
});
204212
</script>
205213

0 commit comments

Comments
 (0)