diff --git a/src/App.css b/src/App.css
index c11baa6..9ee18b0 100644
--- a/src/App.css
+++ b/src/App.css
@@ -10,7 +10,8 @@
}
.App {
- background-color: #282c34;
+ background-color: #1E1E1E;
+ color: #CAD6DC;
min-height: 100vh;
display: flex;
flex-direction: column;
diff --git a/src/App.tsx b/src/App.tsx
index 87938e8..f028e91 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,15 +1,16 @@
-import React, { useState } from 'react';
import './App.css';
-import TableMethodCode from './TableMethodCode';
-
-export interface TableDefinition {
- names?: string[]
- fields?: (string|undefined)[]
- widths?: (number|undefined)[]
- alighments?: ("left"|"right")[]
-}
+import TableMethodCodeBlock from './TableMethodCodeBlock';
+import { TableDefinition } from './TableMethodGenerator';
+import TableRenderer from './TableRenderer';
function App() {
+ let definition: TableDefinition = {
+ names: ["Miestas", "Atsakingas", "Vardas", "Adresas", "Metai"],
+ fields: ["City", "Manager", "Name", "Address", "Year"],
+ widths: [10, 20, 18, 15, 5],
+ alignments: ["left", "left", "left", "left", "right"]
+ }
+
let data = {
method_name: "PrintLocations",
empty_message: "Nėra",
@@ -18,17 +19,23 @@ function App() {
entry_name: "l",
entry_type: "Location",
- definition: {
- names: ["Miestas", "Atsakingas", "Vardas", "Adresas", "Metai"],
- fields: ["City", "Manager", "Name", "Address", "Year"],
- widths: [10, 20, 18, 15, 5]
- }
+ definition
};
+ let test_entries = [
+ ["Alytus", "AlytausMuziejusA", "Jonas Jonaitis", "GatveA", "1999"],
+ ["Alytus", "AlytausMuziejusB", "Ona Onaite", "GatveB", "2018"],
+ ["Kaunas", "KaunasMuziejusC", "Jonas Jonaitis", "GatveC", "2004"],
+ ["Klaipėda", "KlaipėdaMuziejusD", "Ona Onaite", "GatveD", "1988"],
+ ];
+
return (
- {TableMethodCode(data)}
+
+ {TableMethodCodeBlock(data)}
+
+
);
diff --git a/src/TableMethodCode.tsx b/src/TableMethodCode.tsx
deleted file mode 100644
index e422a9b..0000000
--- a/src/TableMethodCode.tsx
+++ /dev/null
@@ -1,103 +0,0 @@
-import SyntaxHighlighter from 'react-syntax-highlighter';
-import { docco } from 'react-syntax-highlighter/dist/esm/styles/hljs';
-import { TableDefinition } from './App';
-
-export interface TableMethodGeneratorProps {
- definition: TableDefinition
-
- method_name?: string
- empty_message?: string
-
- container_type?: string
- container_name?: string
- entry_type?: string
- entry_name?: string
-}
-
-function generateTableMethod(props: TableMethodGeneratorProps): string {
- const section_names = props.definition.names || []
- const method_name = props.method_name || "PrintTable"
- if (section_names.length == 0) {
- return `static void ${method_name}()\n{\n}`;
- }
-
- const empty_message = props.empty_message || "Empty"
- const container_name = props.container_name || "container"
- const container_type = props.container_type || "Container"
- const entry_name = props.entry_name || "e"
- const entry_type = props.entry_type || "Entry"
- const section_widths = props.definition.widths || []
- const section_alignments = props.definition.alighments || []
- const section_fields = props.definition.fields || []
-
- // Total width
- let total_width = 0
- for (let i = 0; i < section_names.length; i++) {
- const section = section_names[i]
- total_width += section_widths[i] || section.length
- }
- total_width += 2 + 2;
- total_width += 3*(section_names.length-1);
-
- // Table row
- let row_components: string[] = []
- for (let i = 0; i < section_names.length; i++) {
- const section = section_names[i]
- const width = section_widths[i] || section.length
- const alighment = section_alignments[i] || "right"
- if (alighment == "left") {
- row_components.push(`{${i},-${width}}`)
- } else {
- row_components.push(`{${i},${width}}`)
- }
- }
-
- let table_row = "";
- if (row_components.length > 0) {
- table_row = "| " + row_components.join(" | ") + " |"
- }
-
- // Section names
- const joined_names = section_names.map((n) => `"${n}"`).join(", ")
-
- // Section fields
- const formatted_fields = []
- for (let i = 0; i < section_names.length; i++) {
- if (section_fields[i]) {
- formatted_fields.push(`${entry_name}.${section_fields[i]}`)
- } else {
- formatted_fields.push(`"-"`)
- }
- }
- const joined_fields = formatted_fields.join(", ")
-
- // Final code string
- return `static void ${method_name}(${container_type} ${container_name})\n{
- if (${container_name}.Count == 0)
- {
- Console.WriteLine("${empty_message}");
- return;
- }
-
- Console.WriteLine(new string('-', ${total_width}));
- Console.WriteLine("${table_row}", ${joined_names});
- Console.WriteLine(new string('-', ${total_width}));
- for (int i = 0; i < ${container_name}.Count; i++)
- {
- ${entry_type} ${entry_name} = ${container_name}.Get(i);
- Console.WriteLine("${table_row}", ${joined_fields});
- }
- Console.WriteLine(new string('-', ${total_width}));\n}`;
-}
-
-function TableMethodCode(props: TableMethodGeneratorProps) {
- return (
-
-
- {generateTableMethod(props)}
-
-
- )
-}
-
-export default TableMethodCode
diff --git a/src/TableMethodCodeBlock.tsx b/src/TableMethodCodeBlock.tsx
new file mode 100644
index 0000000..01c6a8f
--- /dev/null
+++ b/src/TableMethodCodeBlock.tsx
@@ -0,0 +1,16 @@
+import { Light as SyntaxHighlighter } from 'react-syntax-highlighter';
+import csharp from 'react-syntax-highlighter/dist/esm/languages/hljs/csharp';
+import { vs2015 } from 'react-syntax-highlighter/dist/esm/styles/hljs';
+import { generate, TableMethodGeneratorOptions } from './TableMethodGenerator';
+
+SyntaxHighlighter.registerLanguage('csharp', csharp);
+
+function TableMethodCodeBlock(props: TableMethodGeneratorOptions) {
+ return (
+
+ {generate(props)}
+
+ )
+}
+
+export default TableMethodCodeBlock
diff --git a/src/TableMethodGenerator.ts b/src/TableMethodGenerator.ts
new file mode 100644
index 0000000..73e0fc1
--- /dev/null
+++ b/src/TableMethodGenerator.ts
@@ -0,0 +1,146 @@
+type Alignment = "left"|"right"
+
+export interface TableDefinition {
+ names?: string[]
+ fields?: (string|undefined)[]
+ widths?: (number|undefined)[]
+ alignments?: (Alignment|undefined)[]
+}
+
+export interface TableMethodGeneratorOptions {
+ definition: TableDefinition
+
+ method_name?: string
+ empty_message?: string
+
+ container_type?: string
+ container_name?: string
+ entry_type?: string
+ entry_name?: string
+}
+
+function get_total_width(definition: TableDefinition): number {
+ let names = definition.names || []
+ if (names.length == 0) { return 0; }
+
+ let total_width = 0
+ let widths = definition.widths || []
+ for (let i = 0; i < names.length; i++) {
+ const name = names[i]
+ total_width += widths[i] || name.length
+ }
+ total_width += 2 + 2;
+ total_width += 3*(names.length-1);
+
+ return total_width;
+}
+
+export function generate(options: TableMethodGeneratorOptions): string {
+ const section_names = options.definition.names || []
+ const method_name = options.method_name || "PrintTable"
+ if (section_names.length == 0) {
+ return `static void ${method_name}()\n{\n}`;
+ }
+
+ const empty_message = options.empty_message || "Empty"
+ const container_name = options.container_name || "container"
+ const container_type = options.container_type || "Container"
+ const entry_name = options.entry_name || "e"
+ const entry_type = options.entry_type || "Entry"
+ const section_widths = options.definition.widths || []
+ const section_alignments = options.definition.alignments || []
+ const section_fields = options.definition.fields || []
+
+ // Total width
+ const total_width = get_total_width(options.definition)
+
+ // Table row
+ let row_components: string[] = []
+ for (let i = 0; i < section_names.length; i++) {
+ const section = section_names[i]
+ const width = section_widths[i] || section.length
+ const alighment = section_alignments[i] || "right"
+ if (alighment == "left") {
+ row_components.push(`{${i},-${width}}`)
+ } else {
+ row_components.push(`{${i},${width}}`)
+ }
+ }
+
+ let table_row = "";
+ if (row_components.length > 0) {
+ table_row = "| " + row_components.join(" | ") + " |"
+ }
+
+ // Section names
+ const joined_names = section_names.map((n) => `"${n}"`).join(", ")
+
+ // Section fields
+ const formatted_fields = []
+ for (let i = 0; i < section_names.length; i++) {
+ if (section_fields[i]) {
+ formatted_fields.push(`${entry_name}.${section_fields[i]}`)
+ } else {
+ formatted_fields.push(`"-"`)
+ }
+ }
+ const joined_fields = formatted_fields.join(", ")
+
+ // Final code string
+ return `static void ${method_name}(${container_type} ${container_name})\n{
+ if (${container_name}.Count == 0)
+ {
+ Console.WriteLine("${empty_message}");
+ return;
+ }
+
+ Console.WriteLine(new string('-', ${total_width}));
+ Console.WriteLine("${table_row}", ${joined_names});
+ Console.WriteLine(new string('-', ${total_width}));
+ for (int i = 0; i < ${container_name}.Count; i++)
+ {
+ ${entry_type} ${entry_name} = ${container_name}.Get(i);
+ Console.WriteLine("${table_row}", ${joined_fields});
+ }
+ Console.WriteLine(new string('-', ${total_width}));\n}`;
+}
+
+function render_table_row(definition: TableDefinition, entry: string[]): string {
+ let names = definition.names || []
+ if (names.length == 0) { return ""; }
+
+ const columns: string[] = []
+ const alighments = definition.alignments || []
+ const widths = definition.widths || []
+ for (let i = 0; i < names.length; i++) {
+ const value = entry[i] || "";
+ const alighment = alighments[i] || "right"
+ const width = widths[i] || names[i].length
+
+ const filler = " ".repeat(Math.max(width - value.length, 0));
+ if (alighment == "left") {
+ columns.push(value + filler);
+ } else {
+ columns.push(filler + value);
+ }
+ }
+ return "| " + columns.join(" | ") + " |"
+}
+
+export function render_table(definition: TableDefinition, entries: string[][]): string {
+ if (!definition.names) {return ""; }
+
+ const total_width = get_total_width(definition)
+ const seperator = "-".repeat(total_width)
+
+ const lines = []
+ lines.push(seperator)
+ lines.push(render_table_row(definition, definition.names))
+ lines.push(seperator)
+ for (let i = 0; i < entries.length; i++) {
+ lines.push(render_table_row(definition, entries[i]))
+ }
+ lines.push(seperator)
+
+ return lines.join("\n")
+}
diff --git a/src/TableRenderer.tsx b/src/TableRenderer.tsx
new file mode 100644
index 0000000..b82bcf0
--- /dev/null
+++ b/src/TableRenderer.tsx
@@ -0,0 +1,16 @@
+import { render_table, TableDefinition } from "./TableMethodGenerator"
+
+export interface TableRendererProps {
+ definition: TableDefinition,
+ entries: string[][]
+}
+
+function TableRenderer(props: TableRendererProps) {
+ return (
+
+ {render_table(props.definition, props.entries)}
+
+ )
+}
+
+export default TableRenderer