From 83328e637c8fc38e227881d6dad2d2a4a7b19325 Mon Sep 17 00:00:00 2001
From: Benedikt Seeger <benedikt.seeger@ptb.de>
Date: Fri, 21 Feb 2025 17:50:19 +0100
Subject: [PATCH] added expanded project minimal files

---
 dcc-viewer/.idea/.gitignore                   |  8 ++++++++
 dcc-viewer/.idea/dcc-viewer.iml               | 12 +++++++++++
 .../inspectionProfiles/Project_Default.xml    | 15 ++++++++++++++
 dcc-viewer/.idea/modules.xml                  |  8 ++++++++
 dcc-viewer/.idea/vcs.xml                      |  6 ++++++
 dcc-viewer/package.json                       |  6 ++++++
 dcc-viewer/public/index.html                  | 18 +++++++++++++++++
 dcc-viewer/public/styles.css                  |  2 ++
 dcc-viewer/src/components/BaseViewer.ts       |  7 +++++++
 dcc-viewer/src/components/JSONTreeViewer.ts   |  9 +++++++++
 dcc-viewer/src/globalData.ts                  |  1 +
 dcc-viewer/src/globalOptions.ts               |  1 +
 dcc-viewer/src/idRegistry.ts                  |  1 +
 dcc-viewer/src/main.ts                        | 20 +++++++++++++++++++
 dcc-viewer/src/ui/languageSelector.ts         |  6 ++++++
 dcc-viewer/src/ui/themeSwitcher.ts            |  4 ++++
 dcc-viewer/src/utils.ts                       |  4 ++++
 dcc-viewer/src/viewerRegistry.ts              |  5 +++++
 dcc-viewer/src/xmlToJson.ts                   |  5 +++++
 dcc-viewer/tsconfig.json                      |  1 +
 project_structure.json                        |  2 +-
 21 files changed, 140 insertions(+), 1 deletion(-)
 create mode 100644 dcc-viewer/.idea/.gitignore
 create mode 100644 dcc-viewer/.idea/dcc-viewer.iml
 create mode 100644 dcc-viewer/.idea/inspectionProfiles/Project_Default.xml
 create mode 100644 dcc-viewer/.idea/modules.xml
 create mode 100644 dcc-viewer/.idea/vcs.xml
 create mode 100644 dcc-viewer/package.json
 create mode 100644 dcc-viewer/public/index.html
 create mode 100644 dcc-viewer/public/styles.css
 create mode 100644 dcc-viewer/src/components/BaseViewer.ts
 create mode 100644 dcc-viewer/src/components/JSONTreeViewer.ts
 create mode 100644 dcc-viewer/src/globalData.ts
 create mode 100644 dcc-viewer/src/globalOptions.ts
 create mode 100644 dcc-viewer/src/idRegistry.ts
 create mode 100644 dcc-viewer/src/main.ts
 create mode 100644 dcc-viewer/src/ui/languageSelector.ts
 create mode 100644 dcc-viewer/src/ui/themeSwitcher.ts
 create mode 100644 dcc-viewer/src/utils.ts
 create mode 100644 dcc-viewer/src/viewerRegistry.ts
 create mode 100644 dcc-viewer/src/xmlToJson.ts
 create mode 100644 dcc-viewer/tsconfig.json

diff --git a/dcc-viewer/.idea/.gitignore b/dcc-viewer/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/dcc-viewer/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/dcc-viewer/.idea/dcc-viewer.iml b/dcc-viewer/.idea/dcc-viewer.iml
new file mode 100644
index 0000000..24643cc
--- /dev/null
+++ b/dcc-viewer/.idea/dcc-viewer.iml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.tmp" />
+      <excludeFolder url="file://$MODULE_DIR$/temp" />
+      <excludeFolder url="file://$MODULE_DIR$/tmp" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/dcc-viewer/.idea/inspectionProfiles/Project_Default.xml b/dcc-viewer/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..798a81f
--- /dev/null
+++ b/dcc-viewer/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,15 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="ignoredPackages">
+        <value>
+          <list size="1">
+            <item index="0" class="java.lang.String" itemvalue="bokeh" />
+          </list>
+        </value>
+      </option>
+    </inspection_tool>
+  </profile>
+</component>
\ No newline at end of file
diff --git a/dcc-viewer/.idea/modules.xml b/dcc-viewer/.idea/modules.xml
new file mode 100644
index 0000000..7342473
--- /dev/null
+++ b/dcc-viewer/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/dcc-viewer.iml" filepath="$PROJECT_DIR$/.idea/dcc-viewer.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/dcc-viewer/.idea/vcs.xml b/dcc-viewer/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/dcc-viewer/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/dcc-viewer/package.json b/dcc-viewer/package.json
new file mode 100644
index 0000000..019e6c9
--- /dev/null
+++ b/dcc-viewer/package.json
@@ -0,0 +1,6 @@
+{
+    "name": "dcc-viewer",
+    "version": "1.0.0",
+    "scripts": { "dev": "vite" },
+    "dependencies": { "xml2js": "^0.4.23" }
+}
\ No newline at end of file
diff --git a/dcc-viewer/public/index.html b/dcc-viewer/public/index.html
new file mode 100644
index 0000000..e363a2d
--- /dev/null
+++ b/dcc-viewer/public/index.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang='en'>
+<head>
+    <meta charset='UTF-8'>
+    <title>DCC Viewer</title>
+    <script type='module' src='dist/main.js'></script>
+    <link rel='stylesheet' href='styles.css'>
+</head>
+<body>
+    <input type='file' id='file-input' accept='.xml'>
+    <button id='theme-toggle'>Toggle Theme</button>
+    <select id='language-select'>
+        <option value='en'>English</option>
+        <option value='de'>German</option>
+    </select>
+    <div id='json-container'></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/dcc-viewer/public/styles.css b/dcc-viewer/public/styles.css
new file mode 100644
index 0000000..732e263
--- /dev/null
+++ b/dcc-viewer/public/styles.css
@@ -0,0 +1,2 @@
+body { font-family: Arial, sans-serif; }
+.dark-mode { background-color: black; color: white; }
\ No newline at end of file
diff --git a/dcc-viewer/src/components/BaseViewer.ts b/dcc-viewer/src/components/BaseViewer.ts
new file mode 100644
index 0000000..9837734
--- /dev/null
+++ b/dcc-viewer/src/components/BaseViewer.ts
@@ -0,0 +1,7 @@
+export abstract class BaseViewer {
+    protected sectionData: any;
+    constructor(sectionData: any) {
+        this.sectionData = sectionData;
+    }
+    abstract render(): HTMLElement;
+}
\ No newline at end of file
diff --git a/dcc-viewer/src/components/JSONTreeViewer.ts b/dcc-viewer/src/components/JSONTreeViewer.ts
new file mode 100644
index 0000000..ef06785
--- /dev/null
+++ b/dcc-viewer/src/components/JSONTreeViewer.ts
@@ -0,0 +1,9 @@
+import { BaseViewer } from './BaseViewer';
+
+export class JSONTreeViewer extends BaseViewer {
+    render(): HTMLElement {
+        const container = document.createElement('pre');
+        container.textContent = JSON.stringify(this.sectionData, null, 2);
+        return container;
+    }
+}
\ No newline at end of file
diff --git a/dcc-viewer/src/globalData.ts b/dcc-viewer/src/globalData.ts
new file mode 100644
index 0000000..8bc8fad
--- /dev/null
+++ b/dcc-viewer/src/globalData.ts
@@ -0,0 +1 @@
+export const globalData: { [key: string]: any } = {};
\ No newline at end of file
diff --git a/dcc-viewer/src/globalOptions.ts b/dcc-viewer/src/globalOptions.ts
new file mode 100644
index 0000000..09c0db1
--- /dev/null
+++ b/dcc-viewer/src/globalOptions.ts
@@ -0,0 +1 @@
+export const globalOptions = { preferredLanguage: 'en' };
\ No newline at end of file
diff --git a/dcc-viewer/src/idRegistry.ts b/dcc-viewer/src/idRegistry.ts
new file mode 100644
index 0000000..e98ebab
--- /dev/null
+++ b/dcc-viewer/src/idRegistry.ts
@@ -0,0 +1 @@
+export const idRegistry: { [id: string]: any } = {};
\ No newline at end of file
diff --git a/dcc-viewer/src/main.ts b/dcc-viewer/src/main.ts
new file mode 100644
index 0000000..76059c7
--- /dev/null
+++ b/dcc-viewer/src/main.ts
@@ -0,0 +1,20 @@
+import { convertXMLToJSON } from './xmlToJson';
+import { JSONTreeViewer } from './components/JSONTreeViewer';
+
+const fileInput = document.getElementById('file-input') as HTMLInputElement;
+const container = document.getElementById('json-container') as HTMLElement;
+
+fileInput.addEventListener('change', async (event) => {
+    const file = (event.target as HTMLInputElement).files?.[0];
+    if (!file) return;
+
+    const reader = new FileReader();
+    reader.onload = async () => {
+        const xmlString = reader.result as string;
+        const jsonData = await convertXMLToJSON(xmlString);
+        const viewer = new JSONTreeViewer(jsonData);
+        container.innerHTML = '';
+        container.appendChild(viewer.render());
+    };
+    reader.readAsText(file);
+});
\ No newline at end of file
diff --git a/dcc-viewer/src/ui/languageSelector.ts b/dcc-viewer/src/ui/languageSelector.ts
new file mode 100644
index 0000000..0854c83
--- /dev/null
+++ b/dcc-viewer/src/ui/languageSelector.ts
@@ -0,0 +1,6 @@
+import { globalOptions } from '../globalOptions';
+
+const languageSelect = document.getElementById('language-select') as HTMLSelectElement;
+languageSelect.addEventListener('change', (event) => {
+    globalOptions.preferredLanguage = (event.target as HTMLSelectElement).value;
+});
\ No newline at end of file
diff --git a/dcc-viewer/src/ui/themeSwitcher.ts b/dcc-viewer/src/ui/themeSwitcher.ts
new file mode 100644
index 0000000..931533f
--- /dev/null
+++ b/dcc-viewer/src/ui/themeSwitcher.ts
@@ -0,0 +1,4 @@
+const themeToggle = document.getElementById('theme-toggle') as HTMLButtonElement;
+themeToggle.addEventListener('click', () => {
+    document.body.classList.toggle('dark-mode');
+});
\ No newline at end of file
diff --git a/dcc-viewer/src/utils.ts b/dcc-viewer/src/utils.ts
new file mode 100644
index 0000000..fb95467
--- /dev/null
+++ b/dcc-viewer/src/utils.ts
@@ -0,0 +1,4 @@
+export function getLocalizedText(elements: any[]): string {
+    if (!Array.isArray(elements)) return elements;
+    return elements[0]._ || '';
+}
\ No newline at end of file
diff --git a/dcc-viewer/src/viewerRegistry.ts b/dcc-viewer/src/viewerRegistry.ts
new file mode 100644
index 0000000..6e6b15a
--- /dev/null
+++ b/dcc-viewer/src/viewerRegistry.ts
@@ -0,0 +1,5 @@
+import { JSONTreeViewer } from './components/JSONTreeViewer';
+
+export function getViewerForElement(): any {
+    return JSONTreeViewer;
+}
\ No newline at end of file
diff --git a/dcc-viewer/src/xmlToJson.ts b/dcc-viewer/src/xmlToJson.ts
new file mode 100644
index 0000000..03506aa
--- /dev/null
+++ b/dcc-viewer/src/xmlToJson.ts
@@ -0,0 +1,5 @@
+import { parseStringPromise } from 'xml2js';
+
+export async function convertXMLToJSON(xmlString: string): Promise<any> {
+    return parseStringPromise(xmlString, { explicitArray: false, mergeAttrs: true });
+}
\ No newline at end of file
diff --git a/dcc-viewer/tsconfig.json b/dcc-viewer/tsconfig.json
new file mode 100644
index 0000000..ff383c8
--- /dev/null
+++ b/dcc-viewer/tsconfig.json
@@ -0,0 +1 @@
+{ "compilerOptions": { "target": "ES6", "module": "ES6", "outDir": "dist" } }
\ No newline at end of file
diff --git a/project_structure.json b/project_structure.json
index 854fa90..ec74642 100644
--- a/project_structure.json
+++ b/project_structure.json
@@ -22,6 +22,6 @@
       "styles.css": "body { font-family: Arial, sans-serif; }\n.dark-mode { background-color: black; color: white; }"
     },
     "package.json": "{\n    \"name\": \"dcc-viewer\",\n    \"version\": \"1.0.0\",\n    \"scripts\": { \"dev\": \"vite\" },\n    \"dependencies\": { \"xml2js\": \"^0.4.23\" }\n}",
-    "tsconfig.json": "{ \"compilerOptions\": { \"target\": \"ES6\", \"module\": \"ES6\", \"outDir\": \"dist\" } }",
+    "tsconfig.json": "{ \"compilerOptions\": { \"target\": \"ES6\", \"module\": \"ES6\", \"outDir\": \"dist\" } }"
    }
 }
-- 
GitLab