implemented synthax highlightingo

This commit is contained in:
2023-06-28 14:03:35 +02:00
parent 395ca6817d
commit 475feaf849
11 changed files with 3839 additions and 197 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -12,8 +12,13 @@
"format": "prettier --write src/" "format": "prettier --write src/"
}, },
"dependencies": { "dependencies": {
"hljs": "^6.2.3", "@codemirror/lang-html": "^6.4.5",
"@codemirror/lang-json": "^6.0.1",
"@codemirror/lang-xml": "^6.0.2",
"@codemirror/theme-one-dark": "^6.1.2",
"codemirror": "^6.0.1",
"vue": "^3.3.4", "vue": "^3.3.4",
"vue-codemirror": "^6.1.1",
"vue-router": "^4.2.2" "vue-router": "^4.2.2"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -0,0 +1,58 @@
<script setup lang="ts">
import { computed, ref } from 'vue'
import { Codemirror } from 'vue-codemirror'
import { oneDark } from '@codemirror/theme-one-dark'
import {xml} from '@codemirror/lang-xml'
import {json} from '@codemirror/lang-json'
import {html} from '@codemirror/lang-html'
const props= defineProps({
code : {
type: String,
required: true
},
config: {
type: Object,
required: true
},
})
const extensions = computed( ()=> {
return [
oneDark,
parseLanguage(props.config.language),
]
} )
function parseLanguage(name: String){
switch(name.toUpperCase()){
case "JSON": {
return json();
}
case "HTML": {
return html();
}
default: {
return xml();
}
}
}
</script>
<template>
<div class="editor h-full overflow-scroll">
<codemirror
style="height: 100%; padding:0.5rem ; border-radius: 0.5rem"
:model-value="code"
:extensions="extensions"
:disabled="config.disabled"
/>
</div>
</template>

View File

@@ -1,15 +1,18 @@
<script setup lang="ts"> <script setup lang="ts">
import CodeEditorComponent from '../CodeEditorComponent.vue';
const props = defineProps( const props = defineProps(
{ {
data: {required: true, type: String} data: {required: true, type: String},
contentType: {required:true,type:String},
} }
) )
</script> </script>
<template> <template>
<span class="text-white text-center h-screen overflow-x-scroll "> <CodeEditorComponent :code="props.data" :config='{disabled:true, language:props.contentType.replace("application/","")}' />
{{ props.data.replace(/\\n/g,"") }}
</span>
</template> </template>

View File

@@ -7,8 +7,9 @@ import HeadersDetailComponent from './HeadersDetailComponent.vue';
const shownDetail = ref('none'); const shownDetail = ref('none');
const currentShownData = ref(''); const currentShownData = ref('');
const currentIndex = ref(-1); const currentIndex = ref(-1);
const currentContentType = ref('application/json');
function showBody(body : string, index: number){ function showBody(body : string, index: number, contentType : string){
if( currentIndex.value == index && shownDetail.value == "body" ){ if( currentIndex.value == index && shownDetail.value == "body" ){
shownDetail.value = "none"; shownDetail.value = "none";
} else { } else {
@@ -16,6 +17,7 @@ function showBody(body : string, index: number){
shownDetail.value = "body"; shownDetail.value = "body";
currentShownData.value = body; currentShownData.value = body;
} }
currentContentType.value = contentType;
} }
function showHeaders(headers: object, index: number){ function showHeaders(headers: object, index: number){
@@ -34,7 +36,7 @@ function showHeaders(headers: object, index: number){
<template> <template>
<div class="w-full xl:w-5/12 flex flex-col gap-y-4"> <div class="w-full xl:w-5/12 flex flex-col gap-y-4">
<HistoryRecords class="h-1/3 overflow-y-scroll" @click:show-headers="showHeaders" @click:show-body="showBody"></HistoryRecords> <HistoryRecords class="h-1/3 overflow-y-scroll" @click:show-headers="showHeaders" @click:show-body="showBody"></HistoryRecords>
<BodyDetailComponent :data="currentShownData" v-if="shownDetail == 'body' "></BodyDetailComponent> <BodyDetailComponent :content-type="currentContentType" :data="currentShownData" v-if="shownDetail == 'body' "></BodyDetailComponent>
<HeadersDetailComponent :data="currentShownData" v-if="shownDetail == 'headers' "></HeadersDetailComponent> <HeadersDetailComponent :data="currentShownData" v-if="shownDetail == 'headers' "></HeadersDetailComponent>
</div> </div>
</template> </template>

View File

@@ -4,11 +4,16 @@ import {ref, type Ref } from 'vue';
interface historyRecord { interface historyRecord {
clientUUID : String, clientUUID : String,
dateTimeStamp: String, dateTimeStamp: String,
headers : Object, headers : Headers ,
httpMethod: String, httpMethod: String,
requestBody: String requestBody: String
} }
interface Headers {
'content-type': String,
[propName: string]: any;
}
const emit = defineEmits([ const emit = defineEmits([
'click:showHeaders', 'click:showHeaders',
'click:showBody', 'click:showBody',
@@ -28,9 +33,9 @@ function showHeaders(headers: Object, index : number){
emit('click:showHeaders',headers, index) emit('click:showHeaders',headers, index)
} }
function showBody(body: String , index : number){ function showBody(body: String , index : number, contentType: String){
console.log(body)
emit('click:showBody',body, index) emit('click:showBody',body, index, contentType )
} }
function refreshHistory(){ function refreshHistory(){
@@ -54,7 +59,7 @@ function refreshHistory(){
<td> {{ item.httpMethod }} </td> <td> {{ item.httpMethod }} </td>
<td> <button @click="showHeaders(item.headers, index)">Show Headers</button> </td> <td> <button @click="showHeaders(item.headers, index)">Show Headers</button> </td>
<td> <td>
<button v-if="item.requestBody.length != 0" @click="showBody(item.requestBody, index)">Show Body</button> <button v-if="item.requestBody.length != 0" @click="showBody(item.requestBody, index, item.headers['content-type'])">Show Body</button>
<span v-else>Empty Body</span> <span v-else>Empty Body</span>
</td> </td>
</tr> </tr>

View File

@@ -2,6 +2,7 @@
import {ref, type Ref} from 'vue'; import {ref, type Ref} from 'vue';
import HeadersComponent from './HeadersComponent.vue'; import HeadersComponent from './HeadersComponent.vue';
import SaveComponent from './SaveComponent.vue'; import SaveComponent from './SaveComponent.vue';
import CodeEditorComponent from '../CodeEditorComponent.vue';
const clientUUID = ref(''); const clientUUID = ref('');
const host = window.location.protocol + "//" + window.location.hostname + "/mock"; const host = window.location.protocol + "//" + window.location.hostname + "/mock";
@@ -39,7 +40,7 @@ function putDataInFields(data: mockedMessageData){
</script> </script>
<template> <template>
<div class="flex flex-col w-full xl:w-3/5 text-center dark:text-white gap-6"> <div class="flex overflow-y-scroll flex-col w-full xl:w-3/5 text-center dark:text-white gap-6">
<div> <div>
<label for="link">Link</label><br/> <label for="link">Link</label><br/>
<div class="flex gap-4"> <div class="flex gap-4">
@@ -61,9 +62,9 @@ function putDataInFields(data: mockedMessageData){
</div> </div>
</div> </div>
<div class="flex flex-col"> <div class="flex text-left flex-col overflow-scroll h-3/4">
<label for="messageBody">Body</label> <label for="messageBody text-center">Body</label>
<textarea class="text-field h-64" id="messageBody" v-model="messageData.messageBody"></textarea> <CodeEditorComponent :config="{disabled:false,language:messageData.contentType}" :code="messageData.messageBody" id="messageBody"></CodeEditorComponent>
</div> </div>
<HeadersComponent @update:httpHeaders="(newHeaders: object) => {messageData.httpHeaders = newHeaders }" :key="JSON.stringify(messageData.httpHeaders)" :headers-object="messageData.httpHeaders"></HeadersComponent> <HeadersComponent @update:httpHeaders="(newHeaders: object) => {messageData.httpHeaders = newHeaders }" :key="JSON.stringify(messageData.httpHeaders)" :headers-object="messageData.httpHeaders"></HeadersComponent>
</div> </div>

View File

@@ -2,6 +2,7 @@
import InsertTemplateComponent from '@components/common/InsertTemplateComponent.vue'; import InsertTemplateComponent from '@components/common/InsertTemplateComponent.vue';
import XMLButtonFormatterComponent from '@components/formatter/XMLButtonFormatterComponent.vue' import XMLButtonFormatterComponent from '@components/formatter/XMLButtonFormatterComponent.vue'
import { ref } from 'vue'; import { ref } from 'vue';
import CodeEditor from '../CodeEditorComponent.vue';
const data = ref('') const data = ref('')
@@ -14,6 +15,7 @@ const props = defineProps(
const emit = defineEmits(['update']) const emit = defineEmits(['update'])
function sendValue() { function sendValue() {
console.log("input works")
emit('update', data.value) emit('update', data.value)
} }
@@ -44,6 +46,7 @@ function canBeFormatted() {
<button class="tool-button" @click="clear">Clear</button> <button class="tool-button" @click="clear">Clear</button>
</div> </div>
</div> </div>
<textarea id="xmlField" v-model="data" @input="sendValue()" class="text-field h-full"></textarea> <!-- <textarea id="xmlField" v-model="data" @input="sendValue()" class="text-field h-full"></textarea> -->
<CodeEditor @input="sendValue()" v-model="data" :code="data" :config="{disabled:false, language:stylizedName}"></CodeEditor>
</div> </div>
</template> </template>

View File

@@ -1,5 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import CodeEditor from '../CodeEditorComponent.vue';
const props = defineProps( const props = defineProps(
@@ -136,7 +137,8 @@ function clear() {
</div> </div>
</div> </div>
<div class="text-field overflow-scroll h-full w-full"> <div class="text-field overflow-scroll h-full w-full">
<pre class="whitespace-pre-wrap"><code>{{ result }}</code></pre> <!-- <pre class="whitespace-pre-wrap"><code>{{ result }}</code></pre> -->
<CodeEditor :code="result" :config="{disabled:true,language:tool}"></CodeEditor>
</div> </div>
</div> </div>

View File

@@ -1,4 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import CodeEditorComponent from '@/components/CodeEditorComponent.vue';
import JsonButtonFormatterComponent from '@/components/formatter/JsonButtonFormatterComponent.vue'; import JsonButtonFormatterComponent from '@/components/formatter/JsonButtonFormatterComponent.vue';
import InsertTemplateComponent from '@components/common/InsertTemplateComponent.vue'; import InsertTemplateComponent from '@components/common/InsertTemplateComponent.vue';
import { ref } from 'vue'; import { ref } from 'vue';
@@ -31,6 +32,6 @@ function clear() {
<JsonButtonFormatterComponent :json="json" @update:result="(data: any) => format(data)"></JsonButtonFormatterComponent> <JsonButtonFormatterComponent :json="json" @update:result="(data: any) => format(data)"></JsonButtonFormatterComponent>
</div> </div>
</div> </div>
<textarea name="data" id="data" :value="json" class="text-field h-full"></textarea> <CodeEditorComponent :code="json" :config="{disabled:false,language:'json'}" />
</div> </div>
</template> </template>

View File

@@ -1,6 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import XMLButtonFormatterComponent from '@/components/formatter/XMLButtonFormatterComponent.vue'; import XMLButtonFormatterComponent from '@/components/formatter/XMLButtonFormatterComponent.vue';
import InsertTemplateComponent from '@components/common/InsertTemplateComponent.vue'; import InsertTemplateComponent from '@components/common/InsertTemplateComponent.vue';
import CodeEditorComponent from '@/components/CodeEditorComponent.vue';
import { ref } from 'vue'; import { ref } from 'vue';
@@ -31,6 +32,6 @@ function clear() {
<XMLButtonFormatterComponent :xml="xml" @update:result="(data: any) => format(data)"></XMLButtonFormatterComponent> <XMLButtonFormatterComponent :xml="xml" @update:result="(data: any) => format(data)"></XMLButtonFormatterComponent>
</div> </div>
</div> </div>
<textarea name="data" id="data" :value="xml" class="text-field h-full"></textarea> <CodeEditorComponent :code="xml" :config="{disabled:false,language:'xml'}" />
</div> </div>
</template> </template>