From 212d23114e1a15d426c72bc37f1b132d1578ac57 Mon Sep 17 00:00:00 2001
From: Graham Trott <gtanyware@gmail.com>
Date: Wed, 3 Jun 2020 20:30:16 +0100
Subject: [PATCH] Redesign block & content structure

---
 iwsy/iwsy.js                    |  10 +-
 iwsy/resources/ecs/blocks.txt   |  13 ++-
 iwsy/resources/ecs/content.txt  | 162 ++++++++++++++++----------------
 iwsy/resources/ecs/scripted.txt |   1 -
 iwsy/resources/ecs/steps.txt    |  12 ++-
 iwsy/resources/json/test.json   |  41 ++++----
 6 files changed, 129 insertions(+), 110 deletions(-)

diff --git a/iwsy/iwsy.js b/iwsy/iwsy.js
index 270a440..7e72692 100644
--- a/iwsy/iwsy.js
+++ b/iwsy/iwsy.js
@@ -151,9 +151,13 @@ const IWSY = (container, text) => {
                     if (!block.element) {
                         createBlock(block);
                     }
-                    const content = script.content[item.content];
-                    const converter = new showdown.Converter();
-                    block.textPanel.innerHTML = converter.makeHtml(content.split(`%0a`).join(`\n`));
+                    for (const text of script.content) {
+                        if (text.name === item.content) {
+                            const converter = new showdown.Converter();
+                            block.textPanel.innerHTML =
+                                converter.makeHtml(text.content.split(`%0a`).join(`\n`));
+                        }
+                    }
                 }
             }
         }
diff --git a/iwsy/resources/ecs/blocks.txt b/iwsy/resources/ecs/blocks.txt
index f32f6dd..5b67c47 100644
--- a/iwsy/resources/ecs/blocks.txt
+++ b/iwsy/resources/ecs/blocks.txt
@@ -21,6 +21,7 @@
     variable PropertyNames
     variable PropertyName
     variable SelectedBlock
+    variable SavedIndex
     variable Message
     variable N
     variable NBlocks
@@ -93,7 +94,7 @@ Restart:
         set the text of EditButton to property `name` of Block
         create Link in Cell
         create DeleteBlock in Link
-        set the style of DeleteBlock to `width:1em;margin:0.1em 0 0 0.2em`
+        set the style of DeleteBlock to `width:1em;margin:0.2em 0 0 0.2em`
         set attribute `src` of DeleteBlock to `/resources/icon/stop.png`
         create Editor in Row
         set the style of Editor to `margin:0.5em;border:1px solid black;padding:0.2em;display:none`
@@ -101,8 +102,9 @@ Restart:
     end
     on click EditButton
     begin
-    	gosub to SaveSelectedBlock
-        put the index of EditButton into SelectedBlock
+        put the index of EditButton into SavedIndex
+        gosub to SaveSelectedBlock
+        put SavedIndex into SelectedBlock
         put 0 into N
         while N is less than NBlocks
         begin
@@ -118,10 +120,10 @@ Restart:
         end
         index EditButton to SelectedBlock
         index Editor to SelectedBlock
+        index SaveButton to SelectedBlock
 		if style `display` of Editor is `none`
         begin
         	set style `background` of EditButton to `lightgray`
-            index SaveButton to SelectedBlock
             set style `display` of Editor to `block`
             put element SelectedBlock of Blocks into Block
             put the json count of PropertyNames into N
@@ -149,7 +151,6 @@ Restart:
         end
         else
         begin
-        	gosub to SaveSelectedBlock
             clear Editor
             set style `display` of Editor to `none`
         end
@@ -166,6 +167,7 @@ Restart:
 !	Save the seleced block
 SaveSelectedBlock:
 	if SelectedBlock is -1 return
+    index EditButton to SelectedBlock
     put element SelectedBlock of Blocks into Block
 	put 0 into N
     while N is less than the json count of PropertyNames
@@ -175,6 +177,7 @@ SaveSelectedBlock:
         set property PropertyName of Block to the text of PropertyValue
     	add 1 to N
     end
+    set the text of EditButton to property `name` of Block
     set element SelectedBlock of Blocks to Block
     set property `blocks` of Presentation to Blocks
 
diff --git a/iwsy/resources/ecs/content.txt b/iwsy/resources/ecs/content.txt
index 1d642ab..57561cd 100644
--- a/iwsy/resources/ecs/content.txt
+++ b/iwsy/resources/ecs/content.txt
@@ -5,13 +5,10 @@
     import div Panel and variable Presentation
     
     div Editor
+    div Title
+    div Table
     div Row
     div Cell
-    div Title
-    table Table
-    tr TR
-    td TD
-    span ItemNameSpan
     input ItemNameInput
     textarea TextArea
     button EditButton
@@ -24,10 +21,11 @@
     variable ItemNames
     variable ItemName
     variable SelectedItem
-    variable Action
+    variable SavedIndex
     variable Message
     variable N
-    variable B
+    variable NumItems
+    variable Content
     
     put -1 into SelectedItem
     
@@ -44,7 +42,14 @@ Start:
 
 Restart:
 	put property `content` of Presentation into Items
-    put the json keys of Items into ItemNames
+    set ItemNames to array
+    put 0 into N
+    while N is less than the json count of Items
+    begin
+    	put element N of Items into Item
+        json add property `name` of Item to ItemNames
+    	add 1 to N
+    end
 
 	clear Panel
     create Row in Panel
@@ -68,99 +73,89 @@ Restart:
         go to Restart
     end
 
-	put the json keys of Items into ItemNames
-    put the json count of ItemNames into N
-    set the elements of ItemNameSpan to N
-    set the elements of ItemNameInput to N
-    set the elements of EditButton to N
-    set the elements of Editor to N
-    set the elements of SaveButton to N
-    set the elements of DeleteItem to N
-    set the elements of TextArea to N
+    put the json count of Items into NumItems
+    set the elements of EditButton to NumItems
+    set the elements of Editor to NumItems
+    set the elements of SaveButton to NumItems
+    set the elements of DeleteItem to NumItems
+    set the elements of ItemNameInput to NumItems
+    set the elements of TextArea to NumItems
     create Table in Panel
     set the style of Table to `width:100%`
-    put 0 into B
-    while B is less than the elements of EditButton
+    put 0 into N
+    while N is less than the elements of EditButton
     begin
-        index EditButton to B
-        index DeleteItem to B
-        index ItemNameSpan to B
-        index ItemNameInput to B
-    	put element B of ItemNames into ItemName
-        create TR in Table
-        create TD in TR
-        set the style of TD to `width:8em;border:1px solid black`
-        index ItemNameSpan to B
-        create ItemNameSpan in TD
-        set the content of ItemNameSpan to ItemName
-        index ItemNameInput to B
-        create ItemNameInput in TD
-        set the style of ItemNameInput to `width:100%;display:none`
-        set the content of ItemNameInput to ItemName
-        create TD in TR
-    	set the style of TD to `border:1px solid black`
-        index Editor to B
-        create Row in TD
-        set the style of Row to `display:flex`
-        create EditButton in Row
-        set the style of EditButton to `flex:1`
-        set the text of EditButton to `Edit`
+        index EditButton to N
+        index DeleteItem to N
+        index Editor to N
+        index ItemNameInput to N
+        put element N of Items into Item
+        put property `name` of Item into ItemName
+        create Row in Table
         create Cell in Row
-        set the style of Cell to `width:1.4em;text-align:center`
+        set the style of Cell to `width:100%;display:flex`
+        create EditButton in Cell
+        set the style of EditButton to `flex:1`
+        set the text of EditButton to ItemName
         create Link in Cell
         create DeleteItem in Link
-        set the style of DeleteItem to `width:1em;margin-top:0.1em`
+        set the style of DeleteItem to `width:1em;margin:0.2em 0 0 0.2em`
         set attribute `src` of DeleteItem to `/resources/icon/stop.png`
-        create Editor in TD
-        set the style of Editor to `display:none`
-    	add 1 to B
+        create Editor in Row
+        set the style of Editor to `margin:0.5em;border:1px solid black;padding:0.2em;display:none`
+    	add 1 to N
     end
     on click EditButton
     begin
-    	gosub to SaveSelectedItem
-        put the index of EditButton into SelectedItem
-        put the text of EditButton into Action
+        put the index of EditButton into SavedIndex
+        gosub to SaveSelectedItem
+        put SavedIndex into SelectedItem
         put 0 into N
-        while N is less than the json count of ItemNames
+        while N is less than NumItems
         begin
-           	index EditButton to N
-        	set style `background` of EditButton to ``
-            set the text of EditButton to `Edit`
-            index ItemNameSpan to N
-            index ItemNameInput to N
-            set the content of ItemNameSpan to the text of ItemNameInput
-            set style `display` of ItemNameSpan to `inline`
-            set style `display` of ItemNameInput to `none`
-            index Editor to N
-            set style `display` of Editor to `none`
+        	if N is not SelectedItem
+            begin
+                index EditButton to N
+                set style `background` of EditButton to ``
+                index Editor to N
+                set style `display` of Editor to `none`
+                clear Editor
+            end
             add 1 to N
         end
         index EditButton to SelectedItem
-    	if Action is `Edit`
+        index ItemNameInput to SelectedItem
+        index TextArea to SelectedItem
+        index SaveButton to SelectedItem
+        index Editor to SelectedItem
+		if style `display` of Editor is `none`
         begin
+            put element SelectedItem of Items into Item
         	set style `background` of EditButton to `lightgray`
-        	set the text of EditButton to `Close`
-            index ItemNameSpan to SelectedItem
-            index ItemNameInput to SelectedItem
-            index TextArea to SelectedItem
-            index SaveButton to SelectedItem
-            set style `display` of ItemNameSpan to `none`
-            set style `display` of ItemNameInput to `inline`
-            index Editor to SelectedItem
+            create Row in Editor
+            set the style of Row to `display:flex`
+            create Cell in Row
+            set the style of Cell to `width:5em`
+            set the content of Cell to `Name`
+            create ItemNameInput in Row
+            set the style of ItemNameInput to `flex:1`
+            set the text of ItemNameInput to property `name` of Item
             set style `display` of Editor to `block`
-            clear Editor
             create TextArea in Editor
             set the style of TextArea to `width:100%;max-width:100%;height:8em`
-            put element SelectedItem of ItemNames into ItemName
-            put property ItemName of Items into Item
-            replace `%0a` with newline in Item
-            set the content of TextArea to Item
+            put property `content` of Item into Content
+            replace `%0a` with newline in Content
+            set the content of TextArea to Content
             create SaveButton in Editor
             set the style of SaveButton to `width:100%`
             set the text of SaveButton to `Save`
             on click SaveButton gosub to SaveSelectedItem
         end
-        else gosub to SaveSelectedItem
+        else
+        begin
+            clear Editor
+            set style `display` of Editor to `none`
+        end
     end
     on click DeleteItem
     begin
@@ -177,14 +172,15 @@ Restart:
 SaveSelectedItem:
 	if SelectedItem is -1 return
     index ItemNameInput to SelectedItem
+    index EditButton to SelectedItem
+    put element SelectedItem of Items into Item
+    set property `name` of Item to the text of ItemNameInput
+    set the text of EditButton to the text of ItemNameInput
     index TextArea to SelectedItem
-    put the content of TextArea into Item
-    replace newline with `%0a` in Item
-    set property ItemName of Items to Item
-    if ItemNameInput is not ItemName json delete property ItemName of Items
-    put ItemNameInput into ItemName
-    set element SelectedItem of ItemNames to ItemName
-    set property ItemName of Items to Item
+    put the content of TextArea into Content
+    replace newline with `%0a` in Content
+    set property `content` of Item to Content
+    set element SelectedItem of Items to Item
     set property `content` of Presentation to Items
 
 !	Tell the parent to refresh the script
diff --git a/iwsy/resources/ecs/scripted.txt b/iwsy/resources/ecs/scripted.txt
index 79bbbcc..bdf4407 100644
--- a/iwsy/resources/ecs/scripted.txt
+++ b/iwsy/resources/ecs/scripted.txt
@@ -15,7 +15,6 @@
   button Save
   button Delete
   variable Name
-  variable CurrentName
   variable Content
   variable Current
   variable Password
diff --git a/iwsy/resources/ecs/steps.txt b/iwsy/resources/ecs/steps.txt
index 5b0fbe6..4894d1b 100644
--- a/iwsy/resources/ecs/steps.txt
+++ b/iwsy/resources/ecs/steps.txt
@@ -45,6 +45,7 @@
     variable Blocks
     variable Block
     variable Contents
+    variable Content
     variable Target
     variable Duration
     variable URL
@@ -303,7 +304,6 @@ CreateNewStep:
 !	Edit a single step
 EditStep:
 	put property `blocks` of Presentation into Blocks
-    put property `content` of Presentation into Contents
     set BlockNames to array
     put 0 into N
     while N is less than the json count of Blocks
@@ -312,7 +312,15 @@ EditStep:
         json add property `name` of Block to BlockNames
     	add 1 to N
     end
-    put the json keys of Contents into ContentNames
+    put property `content` of Presentation into Contents
+    set ContentNames to array
+    put 0 into N
+    while N is less than the json count of Contents
+    begin
+    	put element N of Contents into Content
+        json add property `name` of Content to ContentNames
+        add 1 to N
+    end
     put element SelectedStep of Steps into CurrentStep
 
     clear Editor
diff --git a/iwsy/resources/json/test.json b/iwsy/resources/json/test.json
index e0bf6a4..6d5b0ba 100644
--- a/iwsy/resources/json/test.json
+++ b/iwsy/resources/json/test.json
@@ -56,46 +56,55 @@
     },
     {
       "name": "left",
-      "background": "",
-      "border": "",
+      "background": "rgba(80,80,80,0.5)",
+      "border": "1px solid gray",
       "borderRadius": "",
       "fontColor": "yellow",
       "fontFamily": "",
       "fontSize": 50,
       "fontStyle": "",
       "fontWeight": "",
-      "height": 700,
+      "height": 650,
       "left": 50,
       "textAlign": "",
-      "textMarginLeft": 10,
-      "textMarginTop": "",
+      "textMarginLeft": 20,
+      "textMarginTop": 20,
       "top": 300,
       "width": 400
     },
     {
       "name": "right",
-      "background": "",
-      "border": "",
+      "background": "rgba(80,80,80,0.5)",
+      "border": "1px solid gray",
       "borderRadius": "",
       "fontColor": "yellow",
       "fontFamily": "",
       "fontSize": 50,
       "fontStyle": "",
       "fontWeight": "",
-      "height": 700,
+      "height": 650,
       "left": 550,
       "textAlign": "",
-      "textMarginLeft": "",
-      "textMarginTop": "",
+      "textMarginLeft": 20,
+      "textMarginTop": 20,
       "top": 300,
       "width": 400
     }
   ],
-  "content": {
-    "main title": "# I Wanna Show You%0a%0a### for knockout presentations",
-    "page 1 left": "### PowerPoint%0a%0a - is slide-based%0a - is a PC application%0a - is hard to embed%0a%0aPowerPoint is organized mainly around static text blocks and tied to the desktop.",
-    "page 1 right": "### I Wanna Show You%0a - is step based%0a - runs in your browser%0a - is fully embeddable%0a%0aIWannaShowYou is a modern product built to handle color, movement and the online world."
-  },
+  "content": [
+    {
+      "name": "iwannashowyou",
+      "content": "# I Wanna Show You%0a%0a### _for knockout presentations_"
+    },
+    {
+      "name": "page 1 left",
+      "content": "### PowerPoint%0a%0a - is slide-based%0a - is a PC application%0a - is hard to embed%0a%0aPowerPoint is a dated product organized mainly around static text blocks and tied to the desktop."
+    },
+    {
+      "name": "page 1 right",
+      "content": "### I Wanna Show You%0a - is step based%0a - runs in your browser%0a - is fully embeddable%0a%0aIWannaShowYou is a modern product built to handle color, movement and a mobile environment."
+    }
+  ],
   "steps": [
     {
       "title": "My first presentation",
@@ -118,7 +127,7 @@
       "blocks": [
         {
           "block": "center title",
-          "content": "main title"
+          "content": "iwannashowyou"
         },
         {
           "block": "left",