9 Commits

Author SHA1 Message Date
c3e0659bfa Deleted unused classes 2023-12-29 13:29:28 +01:00
4f96d91c5c Fixed merge issue 2023-12-29 13:27:52 +01:00
48ff86d837 fixed merge conflicts 2023-12-29 13:09:45 +01:00
c3eef96354 Fixed CSS merge conflicts 2023-12-29 12:58:34 +01:00
ba5d5685b9 Fixed tooltips merge conflicts 2023-12-29 12:56:28 +01:00
e8b22a41c6 Fixed merge conflicts 2023-12-29 12:54:28 +01:00
467adf2264 fixed merge conflict 2023-12-29 12:46:56 +01:00
0812fc6c49 Merge branch 'master' of gitea.release11.com:R11/release11-tools into release 2023-12-29 12:44:49 +01:00
971cc5f36a merge new tools (#244)
Co-authored-by: Adam Bem <adam.bem@zoho.eu>
Co-authored-by: Adam Bem <bema@noreply.example.com>
Reviewed-on: #244
2023-09-05 11:15:20 +02:00
25 changed files with 282 additions and 158 deletions

View File

@@ -1,5 +1,3 @@
from typing import Any
from lxml import etree, html from lxml import etree, html
from io import BytesIO from io import BytesIO
@@ -81,11 +79,9 @@ def xpath(source: str, xpath: str) -> str:
else: else:
result_string = "" result_string = ""
for e in result: for e in result:
if isinstance(e, etree._Element): result_string += etree.tostring(e, pretty_print=True).decode() + "\n"
result_string += etree.tostring(e, pretty_print=True).decode() + "\n" return result_string, "node"
else:
result_string += str(e) + "\n"
return result_string, "node"
def xsd(source: str, xsd: str) -> bool: def xsd(source: str, xsd: str) -> bool:

View File

@@ -18,10 +18,6 @@ import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema; import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory; import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator; import javax.xml.validation.Validator;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.io.StringReader; import java.io.StringReader;
@@ -65,13 +61,6 @@ public class Xalan implements XmlEngine{
return nodeType == Node.CDATA_SECTION_NODE || nodeType == Node.TEXT_NODE; return nodeType == Node.CDATA_SECTION_NODE || nodeType == Node.TEXT_NODE;
} }
private boolean isAttributeNode(Node n) {
if (n == null)
return false;
short nodeType = n.getNodeType();
return nodeType == Node.CDATA_SECTION_NODE || nodeType == Node.ATTRIBUTE_NODE;
}
@Override @Override
public String processXSLT(XMLMultipleFilesData[] data, String transform) throws Exception { public String processXSLT(XMLMultipleFilesData[] data, String transform) throws Exception {
throw new UnsupportedOperationException("Xalan does not support multiple files XSLT processing"); throw new UnsupportedOperationException("Xalan does not support multiple files XSLT processing");
@@ -112,10 +101,7 @@ public class Xalan implements XmlEngine{
for (Node nn = n.getNextSibling(); isTextNode(nn); nn = nn.getNextSibling()) { for (Node nn = n.getNextSibling(); isTextNode(nn); nn = nn.getNextSibling()) {
resultString.append(nn.getNodeValue()); resultString.append(nn.getNodeValue());
} }
} else if (isAttributeNode(n)) { } else {
resultString.append(n.getNodeValue());
}
else {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
serializer.transform(new DOMSource(n), new StreamResult(new OutputStreamWriter(outputStream))); serializer.transform(new DOMSource(n), new StreamResult(new OutputStreamWriter(outputStream)));
resultString.append(outputStream); resultString.append(outputStream);

View File

@@ -1,4 +1,4 @@
# Modern frontend for Release 11 Tools # new-frontend
This template should help get you started developing with Vue 3 in Vite. This template should help get you started developing with Vue 3 in Vite.
@@ -44,46 +44,3 @@ npm run build
```sh ```sh
npm run lint npm run lint
``` ```
## Structure of Vuejs 3 components and views in this project
For this document's needs components and views will be named "modules" even though this is not a correct term for these files officially.
### Main structure
- \<script\>
- \<template\>
- \<style\> - if really needed
### Scripts
#### Elements should be placed in this order:
- Imports
- Props - constant defined by defineProps function, named "props" in code
This name allows to have readable code sending data to parent module:
```TS
props.exampleProp
```
- Emits - constant defined by defineEmits function, named "emit" in code. This name allows to have readable code sending data to parent module:
```TS
emit("update:modelValue", exampleVariable)
```
- Interfaces
- Refs - constants defined by ref functions with appropriate values
- Injects - variables assigned by "inject" function
- Other variables/constants
- onFunctions - functions like onBeforeUpdate
- Other functions
#### Rules regarding functions:
- Functions ought to have descriptive name
- Ought to do one thing. ie. function sendRequest should send request, but not prepare request body or process response data
- In practice, if function has more than 10 SLoC, it probably should be split
- DO NOT use "any" type. Just don't. *Optional
- Function used in other function should be placed below it (if possible, as function can be called from many places in the code)
#### Rules regarding variables and refs:
- Variables ought to have descriptive name
In cases not covered in this convention, TypeScript, VueJS 3 conventions and good programming practices are applied

View File

@@ -0,0 +1,69 @@
<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 emit = defineEmits(
[
'update:updatedCode'
]
)
function dataUpdated(newData:String, viewUpdate : any){
emit('update:updatedCode',newData)
}
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 w-full max-w-full h-full overflow-scroll">
<codemirror
style="height: 100%; width: 100%; padding:1rem ; border-radius: 1rem; font-size: large;"
:model-value="code"
@update:model-value="dataUpdated"
:extensions="extensions"
:disabled="config.disabled"
/>
</div>
</template>

View File

@@ -7,6 +7,12 @@ import {xml} from '@codemirror/lang-xml'
import {json} from '@codemirror/lang-json' import {json} from '@codemirror/lang-json'
import {html} from '@codemirror/lang-html' import {html} from '@codemirror/lang-html'
function isDarkModeSet(){
return localStorage.theme == "dark";
}
const theme : string = inject('theme')! ;
const props= defineProps({ const props= defineProps({
code : { code : {
type: String, type: String,
@@ -24,25 +30,21 @@ const emit = defineEmits(
] ]
) )
const theme : string = inject('theme')!;
let extensions = parseExtensions();
onBeforeUpdate( () => { extensions = parseExtensions(); } )
function dataUpdated(newData:String){ function dataUpdated(newData:String){
emit('update:updatedCode',newData) emit('update:updatedCode',newData)
} }
function selectTheme() { function selectTheme() {
if (isDarkModeSet()) if (isDarkModeSet()) {
return oneDark; return oneDark;
else }
else {
return espresso; return espresso;
}
} }
function isDarkModeSet(){ let extensions = parseExtensions();
return localStorage.theme == "dark";
}
function parseExtensions(){ function parseExtensions(){
return [ return [
@@ -66,7 +68,7 @@ function parseLanguage(name: String){
} }
onBeforeUpdate( () => { extensions = parseExtensions(); } )
</script> </script>

View File

@@ -1,22 +1,30 @@
<script setup lang="ts"> <script setup lang="ts">
const emit = defineEmits([ import lightThemeIcon from '@/assets/light_theme.svg';
"theme", import darkThemeIcon from '@/assets/dark_theme.svg';
]);
const emit = defineEmits([
"theme",
]);
function toDarkMode(){
localStorage.theme = "dark";
document.documentElement.classList.add('dark');
emit('theme',"dark");
}
function toLightMode(){
localStorage.theme = "light";
document.documentElement.classList.remove('dark');
emit('theme',"light");
}
function toDarkMode(){
localStorage.theme = "dark";
document.documentElement.classList.add('dark');
emit('theme',"dark");
}
function toLightMode(){
localStorage.theme = "light";
document.documentElement.classList.remove('dark');
emit('theme',"light");
}
</script> </script>

View File

@@ -21,8 +21,6 @@ const emit = defineEmits([
'update:error' 'update:error'
]) ])
const fetchLink = document.location.protocol + "//" + document.location.hostname + "/libxml/html/" + chooseType(props.formatType);
function chooseType(formatType: String){ function chooseType(formatType: String){
if (formatType == "HTML -> XML"){ if (formatType == "HTML -> XML"){
return "convert"; return "convert";
@@ -47,6 +45,8 @@ function createBody(){
}); });
} }
const fetchLink = document.location.protocol + "//" + document.location.hostname + "/libxml/html/" + chooseType(props.formatType);
function process(){ function process(){
fetch(fetchLink, {body:createBody(), method: "POST"}) fetch(fetchLink, {body:createBody(), method: "POST"})

View File

@@ -19,7 +19,7 @@
<li><strong>XPath</strong> - This is tool that allows to parse XPath on selected XML</li> <li><strong>XPath</strong> - This is tool that allows to parse XPath on selected XML</li>
<li><strong>XQuery</strong> - Allows to execute XQuery on provided XML file.</li> <li><strong>XQuery</strong> - Allows to execute XQuery on provided XML file.</li>
<li><strong>XSD</strong> - Allows to validate XML against provided XSD schema.</li> <li><strong>XSD</strong> - Allows to validate XML against provided XSD schema.</li>
<li><strong>XSLT</strong> - Allows to transform XML using XSLT transform.</li> <li><strong>XSLT</strong> - Allows to transformate XML using XSLT transformate.</li>
</ul> </ul>
<h2 class="text-xl mt-2">Formatter - Tools:</h2> <h2 class="text-xl mt-2">Formatter - Tools:</h2>
@@ -39,4 +39,3 @@
</template> </template>
<style scoped></style> <style scoped></style>

View File

@@ -1,5 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'
const props = defineProps( const props = defineProps(
{ {
name: {type: String, required: true} name: {type: String, required: true}

View File

@@ -1,5 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'
const props = defineProps( const props = defineProps(
{ {
imgPath: {type: String, required: true}, imgPath: {type: String, required: true},

View File

@@ -1,6 +1,18 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref } from 'vue';
// const props = defineProps({
// version: {
// type: String,
// required: true
// },
// toolType: {
// type: String,
// required: true
// }
// })
const emit = defineEmits([ const emit = defineEmits([
"update:visible" "update:visible"
]) ])

View File

@@ -14,5 +14,5 @@ const props = defineProps(
</script> </script>
<template> <template>
<CodeEditorComponent :code="props.data" :config='{disabled:false, language:props.contentType.replace("application/","")}' /> <CodeEditorComponent :code="props.data" :config='{disabled:true, language:props.contentType.replace("application/","")}' />
</template> </template>

View File

@@ -1,11 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import {ref, type Ref } from 'vue'; import {ref, type Ref } from 'vue';
const emit = defineEmits([
'click:showHeaders',
'click:showBody',
])
interface historyRecord { interface historyRecord {
clientUUID : String, clientUUID : String,
dateTimeStamp: String, dateTimeStamp: String,
@@ -19,11 +14,15 @@ interface Headers {
[propName: string]: any; [propName: string]: any;
} }
const emit = defineEmits([
'click:showHeaders',
'click:showBody',
])
const clientUUID = localStorage.getItem("clientUUID") const clientUUID = localStorage.getItem("clientUUID")
const fetchLink = window.location.protocol + "//" + window.location.hostname + "/mock/api/event"; const fetchLink = window.location.protocol + "//" + window.location.hostname + "/mock/api/event";
const historyRecords : Ref<Array<historyRecord>> = ref([]); const historyRecords : Ref<Array<historyRecord>> = ref([])
fetch(fetchLink+"/"+clientUUID).then(response => response.json()).then(data => { historyRecords.value = data }); fetch(fetchLink+"/"+clientUUID).then(response => response.json()).then(data => { historyRecords.value = data });
function parseTimeStamp(timestamp : String){ function parseTimeStamp(timestamp : String){

View File

@@ -1,4 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue';
const emit = defineEmits([ const emit = defineEmits([
'closed:toast_closed', 'closed:toast_closed',

View File

@@ -4,6 +4,10 @@ import HeadersComponent from './HeadersComponent.vue';
import SaveComponent from './SaveComponent.vue'; import SaveComponent from './SaveComponent.vue';
import CodeEditorComponent from '@/components/common/CodeEditorComponent.vue'; import CodeEditorComponent from '@/components/common/CodeEditorComponent.vue';
const clientUUID = ref('');
const host = window.location.protocol + "//" + window.location.hostname + "/mock";
const mockMessageLink = ref("www.google.com");
interface mockedMessageData { interface mockedMessageData {
clientUUID: string; clientUUID: string;
contentType: string; contentType: string;
@@ -12,10 +16,6 @@ interface mockedMessageData {
httpStatus: number; httpStatus: number;
} }
const clientUUID = ref('');
const host = window.location.protocol + "//" + window.location.hostname + "/mock";
const mockMessageLink = ref("www.google.com");
const exampleData : mockedMessageData = { const exampleData : mockedMessageData = {
clientUUID : "exampleUUID", clientUUID : "exampleUUID",
contentType: "application/json", contentType: "application/json",
@@ -23,8 +23,8 @@ const exampleData : mockedMessageData = {
httpHeaders: {Connection:"keep-alive"}, httpHeaders: {Connection:"keep-alive"},
httpStatus: 200, httpStatus: 200,
} }
let messageData : Ref<mockedMessageData> = ref(exampleData);
let messageData : Ref<mockedMessageData> = ref(exampleData);
if ( localStorage.clientUUID != undefined ){ if ( localStorage.clientUUID != undefined ){
clientUUID.value = localStorage.clientUUID; clientUUID.value = localStorage.clientUUID;
} }

View File

@@ -1,9 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
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 CodeEditor from '@/components/common/CodeEditorComponent.vue'
import { ref } from 'vue' import { ref } from 'vue'
import CodeEditor from '@/components/common/CodeEditorComponent.vue'
const props = defineProps( const props = defineProps(
{ {

View File

@@ -0,0 +1,22 @@
<script setup lang="ts">
import InsertTemplateComponent from '@components/common/InsertTemplateComponent.vue'
const props = defineProps(
{
prettyName: {type: String, required: true}
}
)
const emit = defineEmits(['update:defaultData'])
function setDefault(data: string) {
const emitName = "update:defaultData";
emit(emitName, data)
}
</script>
<template>
</template>

View File

@@ -7,12 +7,11 @@ const props = defineProps(
{ {
tool: {type: String, required: true}, tool: {type: String, required: true},
xml: {type: [String, Array<TabData>], required: true}, xml: {type: [String, Array<TabData>], required: true},
query: {type: String, required: true}, query: {type: String, required: true}
activeTabId: {type: Number, required: false}
} }
) )
const emit = defineEmits(["update", "update:engine"]); const emit = defineEmits(["update"]);
const result = ref(''); const result = ref('');
@@ -55,7 +54,6 @@ function changeAvailableVersions() {
changeAvailableVersionsOfXSLT(); changeAvailableVersionsOfXSLT();
else if (props.tool == "xsd") else if (props.tool == "xsd")
versionsForCurrentEngine.value = ["N/A"]; versionsForCurrentEngine.value = ["N/A"];
else if (props.tool == "xpath") else if (props.tool == "xpath")
changeAvailableVersionsOfXPath(); changeAvailableVersionsOfXPath();
@@ -112,21 +110,19 @@ function prepareURL(): string {
const engineEndpoint = engine.value == "libxml" ? "libxml" : "java"; const engineEndpoint = engine.value == "libxml" ? "libxml" : "java";
let tool = props.tool; let tool = props.tool;
if (Array.isArray(props.xml) && props.xml.length > 1 && engine.value == "saxon") if (Array.isArray(props.xml) && props.xml.length > 1)
tool = "multiple/xslt"; tool = "multiple/xslt";
return document.location.protocol + "//" + document.location.hostname + "/" + engineEndpoint + "/" + tool; return document.location.protocol + "//" + document.location.hostname + "/" + engineEndpoint + "/" + tool;
} }
function selectRequestBodyType() : string { function selectRequestBodyType() : string {
if (Array.isArray(props.xml) && (engine.value == "xalan" || engine.value == "libxml")) if (Array.isArray(props.xml) && props.xml.length > 1)
return prepareRequestBodySingleXml(props.xml.at(props.activeTabId!)!.data) return prepareRequestBodyMultiXml();
else if (Array.isArray(props.xml) && props.xml.length > 1)
return prepareRequestBodyMultiXml();
else if (Array.isArray(props.xml)) else if (Array.isArray(props.xml))
return prepareRequestBodySingleXml(props.xml.at(0)!.data); return prepareRequestBodySingleXml(props.xml.at(0)!.data);
else else
return prepareRequestBodySingleXml(props.xml!); return prepareRequestBodySingleXml(props.xml!);
} }
function prepareRequestBodySingleXml(data: string):string { function prepareRequestBodySingleXml(data: string):string {
@@ -191,10 +187,6 @@ function emitVersionChange() {
emit("update", version.value); emit("update", version.value);
} }
function emitEngineChange() {
emit("update:engine", engine.value);
}
function isVersionSelectionAvailable() { function isVersionSelectionAvailable() {
return !(versionsForCurrentEngine.value.length == 1 && versionsForCurrentEngine.value.at(0) == "N/A"); return !(versionsForCurrentEngine.value.length == 1 && versionsForCurrentEngine.value.at(0) == "N/A");
} }
@@ -209,11 +201,6 @@ function highlightField() {
return ""; return "";
} }
function handleChange() {
changeAvailableVersions();
emitEngineChange();
}
</script> </script>
<template> <template>
@@ -221,7 +208,7 @@ function handleChange() {
<div class="flex place-content-between w-full items-center pb-2"> <div class="flex place-content-between w-full items-center pb-2">
<span class="dark:text-white">Result:</span> <span class="dark:text-white">Result:</span>
<div class="flex space-x-2 overflow-x-auto"> <div class="flex space-x-2 overflow-x-auto">
<select v-model="engine" name="engine" @change="handleChange()" class="px-3 rounded-full border border-slate-400 bg-white dark:text-slate-100 dark:bg-gray-600"> <select v-model="engine" name="engine" @change="changeAvailableVersions()" class="px-3 rounded-full border border-slate-400 bg-white dark:text-slate-100 dark:bg-gray-600">
<option v-for="engine in enginesForCurrentTool" :value="engine">{{ engine }}</option> <option v-for="engine in enginesForCurrentTool" :value="engine">{{ engine }}</option>
</select> </select>
<select v-model="version" v-if="isVersionSelectionAvailable()" name="version" @change="emitVersionChange()" class="px-3 rounded-full border border-slate-400 bg-white dark:text-slate-100 dark:bg-gray-600"> <select v-model="version" v-if="isVersionSelectionAvailable()" name="version" @change="emitVersionChange()" class="px-3 rounded-full border border-slate-400 bg-white dark:text-slate-100 dark:bg-gray-600">

View File

@@ -10,15 +10,13 @@ const props = defineProps(
{ {
stylizedName: {type: String, required: true}, stylizedName: {type: String, required: true},
data: {type: Array<TabData>}, data: {type: Array<TabData>},
tabCountLimit: {type: Number, required: false, validator: (value) => typeof value == "number" && value > 0}, tabCountLimit: {type: Number, required: false, validator: (value) => typeof value == "number" && value > 0}
engine: {type: String, required: true}
} }
) )
const emit = defineEmits(['update:modelValue', 'update:activeTabId']) const emit = defineEmits(['update:modelValue'])
const newTabId = ref(0); const newTabId = ref(0);
const activeTabId = ref(0); const activeTabId = ref(0);
const data = ref('')
const inputFile = ref()
const tabs = ref(new Array<TabData>); const tabs = ref(new Array<TabData>);
tabs.value.push({ tabs.value.push({
@@ -27,12 +25,13 @@ tabs.value.push({
data: "", data: "",
}) })
const data = ref('')
const inputFile = ref()
function sendValue() { function sendValue() {
emit('update:modelValue', tabs.value); emit('update:modelValue', tabs.value);
} }
function emitActiveTab() {
emit('update:activeTabId', activeTabId.value);
}
function updateData(newData: string) { function updateData(newData: string) {
data.value = newData; data.value = newData;
@@ -76,7 +75,6 @@ function changeActiveTab(id : number) {
tabs.value.at(index)!.data = data.value; tabs.value.at(index)!.data = data.value;
activeTabId.value = id; activeTabId.value = id;
emitActiveTab();
data.value = tabs.value.at(newIndex)!.data; data.value = tabs.value.at(newIndex)!.data;
sendValue(); sendValue();
@@ -132,7 +130,7 @@ function findIndexWithID(id : number) : number {
<div class="flex flex-col w-full h-1/2 lg:h-1/2 flex-none xl:pr-2 2xl:pr-4 pb-2"> <div class="flex flex-col w-full h-1/2 lg:h-1/2 flex-none xl:pr-2 2xl:pr-4 pb-2">
<div class="flex justify-between mb-2"> <div class="flex justify-between mb-2">
<div class="flex gap-2 overflow-x-auto"> <div class="flex gap-2 overflow-x-auto">
<TabComponent @click:activate="changeActiveTab" @click:remove="removeTab" v-for="tab in tabs" :id="tab.id" :isActive="tab.id == activeTabId" :class="[tab.id !== activeTabId && (props.engine === 'xalan' ? 'disabled-tab' : '' || props.engine === 'libxml' ? 'disabled-tab' : '')]">{{ tab.name }}</TabComponent> <TabComponent @click:activate="changeActiveTab" @click:remove="removeTab" v-for="tab in tabs" :id="tab.id" :isActive="tab.id == activeTabId">{{ tab.name }}</TabComponent>
</div> </div>
<div class="flex gap-2"> <div class="flex gap-2">
<div class="flex items-stretch w-64"> <div class="flex items-stretch w-64">

View File

@@ -0,0 +1,83 @@
<script setup lang="ts">
import { onMounted, ref, watch } from 'vue';
const xml = ref('');
const transform = ref('');
const transformPlaceholder = ref('');
const engine = ref('');
const result = ref('');
const activeXmlTool = ref('');
async function submit() {
const engineEndpoint = engine.value == "libxml" ? "libxml" : "java";
const url = document.location.protocol + "//" + document.location.hostname + "/" + engineEndpoint + "/" + activeXmlTool.value;
var version = "1.0";
if (engine.value == "saxon")
version = "3.0"
var requestBody = JSON.stringify({
"data": xml.value,
"process": transform.value,
"processor": engine.value,
"version": version
});
var request = new Request(url, {
body: requestBody,
method: "POST"
});
var responseBody = await fetch(request)
.then(response => response.json())
.then((body) => body);
result.value = responseBody.result;
}
watch(activeXmlTool, (tool) => {
if (tool == "xpath")
transformPlaceholder.value = "XPath";
if (tool == "xsd")
transformPlaceholder.value = "XSD";
if (tool == "xslt")
transformPlaceholder.value = "XSLT";
if (tool == "xquery")
transformPlaceholder.value = "XQuery";
transform.value = "";
})
onMounted(() => {
activeXmlTool.value = "xpath";
});
</script>
<template>
<label for="xpath">XPath</label>
<input v-model="activeXmlTool" type="radio" id="xpath" name="xmltool" value="xpath" />
<label for="xslt">XSLT</label>
<input v-model="activeXmlTool" type="radio" id="xslt" name="xmltool" value="xslt" />
<label for="xsd">XSD</label>
<input v-model="activeXmlTool" type="radio" id="xsd" name="xmltool" value="xsd" />
<label for="xquery">XQuery</label>
<input v-model="activeXmlTool" type="radio" id="xquery" name="xmltool" value="xquery" />
<br /><br />
<select name="engine" v-model="engine">
<option value="saxon" selected>Saxon</option>
<option value="xalan">Xalan</option>
<option value="libxml">libXML</option>
</select>
<br />
<textarea v-model="xml" id="xml" placeholder="XML"></textarea>
<textarea v-model="transform" id="transform" :placeholder="transformPlaceholder"></textarea><br />
<button @click="submit">Submit</button><br />
<pre><code>{{ result }}</code></pre>
</template>
<style scoped></style>

View File

@@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import TooltipCategoryComponent from './TooltipCategoryComponent.vue';
import xpathDiffs from '@/assets/tooltips/xpath/xpathdiffs.json'; import xpathDiffs from '@/assets/tooltips/xpath/xpathdiffs.json';
import xsltDiffs from '@/assets/tooltips/xslt/xsltdiffs.json'; import xsltDiffs from '@/assets/tooltips/xslt/xsltdiffs.json';
import TooltipCategoryComponent from './TooltipCategoryComponent.vue';
const props = defineProps({ const props = defineProps({
@@ -10,7 +10,7 @@ const props = defineProps({
}) })
function getDiffEntry(toolVersion : String) : string[] { function getDiffEntry(toolVersion : String) : string[] {
if ( props.toolName == "xpath" ) { if ( props.toolName == "xpath" ){
switch(toolVersion){ switch(toolVersion){
case "2.0" : { case "2.0" : {
return xpathDiffs.VersionDiffs[0].diffs return xpathDiffs.VersionDiffs[0].diffs
@@ -27,7 +27,7 @@ function getDiffEntry(toolVersion : String) : string[] {
} }
} else if (props.toolName == "xslt") { } else if (props.toolName == "xslt") {
return ["XSLT 2.0"].concat(xsltDiffs.VersionDiffs[0].diffs).concat(["XSLT 3.0"]).concat(xsltDiffs.VersionDiffs[1].diffs) ; return ["XSLT 2.0"].concat(xsltDiffs.VersionDiffs[0].diffs).concat(["XSLT 3.0"]).concat(xsltDiffs.VersionDiffs[1].diffs) ;
} else { } else{
return ["foo"] return ["foo"]
} }

View File

@@ -43,7 +43,3 @@
.tab-active { .tab-active {
@apply py-2 px-3 h-fit text-slate-700 border-t border-l border-r border-slate-400 rounded-t-2xl bg-gradient-to-r from-blue-400 to-sky-300 dark:text-white dark:from-sky-600 dark:to-sky-800 hover:bg-blue-400 @apply py-2 px-3 h-fit text-slate-700 border-t border-l border-r border-slate-400 rounded-t-2xl bg-gradient-to-r from-blue-400 to-sky-300 dark:text-white dark:from-sky-600 dark:to-sky-800 hover:bg-blue-400
} }
.disabled-tab {
@apply py-2 px-3 h-fit text-slate-400 border-t border-l border-r border-slate-300 rounded-t-2xl bg-gradient-to-r from-gray-200 to-gray-300 dark:from-gray-700 dark:to-gray-800 pointer-events-none opacity-50;
}

View File

@@ -6,17 +6,17 @@ import { ref } from 'vue'
const data : any = ref("") const data : any = ref("")
const imageData = ref("") const imageData = ref("")
const doShowImage = ref(false) const DoshowImage = ref(false)
const inputImage = ref() const inputImage = ref()
function setTextFieldValue(newData: string) { function setTextFieldValue(newData: string) {
data.value = newData.toString() data.value = newData.toString()
doShowImage.value = false DoshowImage.value = false
} }
function showImage(newImage : string){ function showImage(newImage : string){
imageData.value = "data:image/jpeg;base64,"+newImage imageData.value = "data:image/jpeg;base64,"+newImage
doShowImage.value = true DoshowImage.value = true
} }
function convertImageToBase64(file : any){ function convertImageToBase64(file : any){
@@ -32,7 +32,7 @@ function convertImageToBase64(file : any){
function clear(){ function clear(){
data.value = "" data.value = ""
imageData.value = "" imageData.value = ""
doShowImage.value = false DoshowImage.value = false
inputImage.value.value = null inputImage.value.value = null
} }
@@ -65,7 +65,7 @@ function clear(){
</div> </div>
<div id="layoutRight" class="w-full xl:w-1/2 min-h-[66%] xl:h-full"> <div id="layoutRight" class="w-full xl:w-1/2 min-h-[66%] xl:h-full">
<div class="border-2 rounded-lg border-gray-300 dark:border-gray-600 min-h-[50%]" v-on="doShowImage"> <div class="border-2 rounded-lg border-gray-300 dark:border-gray-600 min-h-[50%]" v-on="DoshowImage">
<img :src="imageData"/> <img :src="imageData"/>
</div> </div>

View File

@@ -11,8 +11,6 @@ import { ref } from 'vue';
const xml = ref(new Array<TabData>); const xml = ref(new Array<TabData>);
const query = ref(''); const query = ref('');
const version = ref(''); const version = ref('');
const engine = ref('')
const activeTabId = ref(0)
function updateVersion(newVersion: string) { function updateVersion(newVersion: string) {
version.value = newVersion; version.value = newVersion;
@@ -24,10 +22,10 @@ function updateVersion(newVersion: string) {
<div id="layout" class="flex flex-row w-full h-full"> <div id="layout" class="flex flex-row w-full h-full">
<div class="flex flex-col 2xl:flex-row w-full xl:w-7/12 grow overflow-hide pr-2"> <div class="flex flex-col 2xl:flex-row w-full xl:w-7/12 grow overflow-hide pr-2">
<div class="flex flex-col w-full 2xl:w-1/2 h-2/3 2xl:h-full flex-none items-center"> <div class="flex flex-col w-full 2xl:w-1/2 h-2/3 2xl:h-full flex-none items-center">
<xmlTabbedInputComponent stylized-name="XML" v-model:activeTabId="activeTabId" :engine="engine" :tab-count-limit="3" v-model="xml"></xmlTabbedInputComponent> <xmlTabbedInputComponent stylized-name="XML" :tab-count-limit="3" v-model="xml"></xmlTabbedInputComponent>
<xmlInputFieldComponent stylized-name="XSLT" :data="query" v-model="query"></xmlInputFieldComponent> <xmlInputFieldComponent stylized-name="XSLT" :data="query" v-model="query"></xmlInputFieldComponent>
</div> </div>
<xmlOutputFieldComponent tool="xslt" :xml="xml" :active-tab-id="activeTabId" v-model:engine="engine" :query="query" @update="updateVersion"></xmlOutputFieldComponent> <xmlOutputFieldComponent tool="xslt" :xml="xml" :query="query" @update="updateVersion"></xmlOutputFieldComponent>
</div> </div>
<TooltipComponent tool-type="xslt" :version="version"></TooltipComponent> <TooltipComponent tool-type="xslt" :version="version"></TooltipComponent>
</div> </div>

View File

@@ -1,6 +1,10 @@
{ {
"data": "<people><person><name>John</name><age>67</age></person><person><name>Anna</name><age>69</age></person></people>", "data": "<people><person><name>John</name><age>67</age></person><person><name>Anna</name><age>69</age></person></people>",
<<<<<<< HEAD
"process": "for $x in //person return string($x/name)",
=======
"processorData": "for $x in //person return string($x/name)", "processorData": "for $x in //person return string($x/name)",
>>>>>>> 307e732608fca31b60027b417412691ff0e1c2f0
"processor": "saxon", "processor": "saxon",
"version": "3.1" "version": "3.1"
} }