From 5145148fc5daf2e380231f339a31df42a4cbf23a Mon Sep 17 00:00:00 2001
From: Frank Steinberg <steinberg@ibr.cs.tu-bs.de>
Date: Fri, 25 Oct 2019 11:08:03 +0200
Subject: [PATCH] I do hate CSS.

---
 README.md                               |  4 +-
 glossary-en-de.csv                      |  1 +
 web/edit.css                            | 16 +++--
 web/edit.html                           |  2 +
 web/edit.js                             | 92 ++++++++-----------------
 web/pell.js                             |  3 +-
 web/show.css                            | 59 +++++++++-------
 web/show.js                             |  7 ++
 xsl/bjcp-2015-styleguide-doc-to-xml.xsl |  4 +-
 9 files changed, 87 insertions(+), 101 deletions(-)

diff --git a/README.md b/README.md
index 0a8284e..e573085 100644
--- a/README.md
+++ b/README.md
@@ -129,4 +129,6 @@ See the LICENSE file. Note that this license relates only to the content of this
 - Maybe, some keyboard control?
 - Support editing "p" (not only in "description"), "li", "td".
 - Better rendering of specs with text content, e.g. 33A.
-- navigate by tags?
+- Navigate by: tags, commercial examples, specs
+- Handling IDs correctly in editor and when saving.
+- modifying parts of whole document addressed by getPathTo().
diff --git a/glossary-en-de.csv b/glossary-en-de.csv
index 7847621..f2451cd 100644
--- a/glossary-en-de.csv
+++ b/glossary-en-de.csv
@@ -28,3 +28,4 @@ enter,einreichen
 entered,eingereicht
 fermentation,Gärung
 fermented,vergoren
+funk,Funk
diff --git a/web/edit.css b/web/edit.css
index 29bb69a..18a8649 100644
--- a/web/edit.css
+++ b/web/edit.css
@@ -26,15 +26,15 @@ div#editor {
   font-size: 9pt;
 }
 div#editor-inner {
+    z-index: 2;
     background-color: white;
     pointer-events: all;
-  text-align: left;
-  margin: 10px auto;
-  padding: 5px;
-  width: 90%;
-  z-index: 2;
-  border: 2px solid black;
-  background: #ddd;
+    text-align: left;
+    margin: 10px auto;
+    padding: 5px;
+    width: 90%;
+    border: 2px solid black;
+    background: #ddd;
 }
 div#editor-inner input {
   background: white;
@@ -102,3 +102,5 @@ styleguide nav:not([todo="0"]) {
 styleguide nav:not([todo]) {
     background-color: white;
 }
+
+
diff --git a/web/edit.html b/web/edit.html
index fea164d..fd25aa2 100644
--- a/web/edit.html
+++ b/web/edit.html
@@ -95,7 +95,9 @@
         <div id="pelleditor"> </div>
       </div>
     </div>
+    <div id="styleguide"/>
     <script src="pell.js"> </script>
+    <script src="show.js"> </script>
     <script src="edit.js"> </script>
   </body>
 </html>
diff --git a/web/edit.js b/web/edit.js
index 40f46ac..c2c87cd 100644
--- a/web/edit.js
+++ b/web/edit.js
@@ -20,6 +20,11 @@ var edit_id;
 var edit_element;
 var element_name;
 
+var styleuide_orig;
+var styleuide_auto;
+
+
+
 pell.init({
     element: pelleditor,
     defaultParagraphSeparator: "p",
@@ -65,7 +70,11 @@ pell.init({
 		xhr.onreadystatechange = function() {
 		    if (xhr.readyState === 4) {
 			editor.style.display = "none";
-			edit_element.innerHTML = text;
+			if (element_name == "name") {
+			    edit_element.innerHTML =  edit_id + ": " + text;
+			} else {
+			    edit_element.innerHTML = text;
+			}
 			edit_element.setAttribute("date", "today");
 			edit_element.setAttribute("author", "you");
 			edit_element.setAttribute("addr", "local");
@@ -114,26 +123,6 @@ pell.init({
 
 
 
-var styleguide;
-var styleuide_orig;
-var styleuide_auto;
-var styleguide_node;
-
-
-
-// load styleguide and trigger rendering
-var xhr1 = new XMLHttpRequest();
-xhr1.onreadystatechange = function() {
-    if (xhr1.readyState === 4) {
-	styleguide = xhr1.responseXML.querySelector("styleguide");
-	renderStyleguide(styleguide);
-    }
-}
-xhr1.open('GET', document.querySelector('link[rel="styleguide"]').href, true);
-xhr1.setRequestHeader('Content-Type','text/xml; charset=UTF-8');
-xhr1.responseType = "document";
-xhr1.send();
-
 // load styleguide_orig
 var xhr2 = new XMLHttpRequest();
 xhr2.onreadystatechange = function() {
@@ -151,6 +140,8 @@ var xhr3 = new XMLHttpRequest();
 xhr3.onreadystatechange = function() {
     if (xhr3.readyState === 4) {
 	styleguide_auto = xhr3.responseXML.querySelector("styleguide");
+	// TBD: call initEditor() event driven, when show.js is ready.
+	setTimeout(initEditor, 1000);
     }
 }
 xhr3.open('GET', document.querySelector('link[rel="styleguide-auto"]').href, true);
@@ -159,6 +150,7 @@ xhr3.responseType = "document";
 xhr3.send();
 
 
+
 function recalcTodo() {
     var parts = styleguide_node.querySelectorAll("category, subcategory");
     for (var i = 0; i < parts.length; i++) {
@@ -183,11 +175,12 @@ function recalcTodo() {
     }
 }
 
-function renderStyleguide(styleguide) {
 
-    styleguide_node = document.importNode(styleguide, true);
+
+function initEditor() {
+
     var editor = document.querySelector("div[id='editor']");
-    editor.parentNode.insertBefore(styleguide_node, editor);
+    //editor.parentNode.insertBefore(styleguide_node, editor);
 
     var parts = styleguide_node.querySelectorAll("name, description, overall-impression, aroma, appearance, flavor, mouthfeel, comments, history, characteristic-ingredients, style-comparison, entry-instructions, commercial-examples, specs");
     for (var i = 0; i < parts.length; i++) {
@@ -213,6 +206,10 @@ function renderStyleguide(styleguide) {
 		text = text.replace(/<p>/g, " ");
 		text = text.replace(/<\/p>/g, " ");
 	    }
+	    if (element_name == "name") {
+		text = text.replace(/^.*: /g, "");
+	    }
+
 	    pelleditor.content.innerHTML = text;
 	    if (lastdate && lastauthor) {
 		text = "last updated by " + lastauthor + " on " + lastdate;
@@ -231,7 +228,11 @@ function renderStyleguide(styleguide) {
 		auto.innerHTML = auto_element.innerHTML;
 	    }
 	    if (undo) {
-		undo.innerHTML = edit_element.innerHTML;
+		if (element_name == "name") {
+		    undo.innerHTML = edit_element.innerHTML.replace(/^.*: /g, "");
+		} else {
+		    undo.innerHTML = edit_element.innerHTML;
+		}
 	    }
 	    if (markup) {
 		markup.innerText = edit_element.innerHTML;
@@ -244,50 +245,11 @@ function renderStyleguide(styleguide) {
 	});
     }
 
-    var parts = styleguide_node.querySelectorAll("chapter, category, subcategory");
-    for (var i = 0; i < parts.length; i++) {
-
-	// add category id to the name element, so that it becomes searchable in browsers
-	if ((parts[i].tagName == "category") || (parts[i].tagName == "subcategory")) {
-	    var id0 = parts[i].getAttribute("id");
-	    var name0 = parts[i].querySelector("name");
-	    if (id0 && name0) {
-		id0 = id0.replace(/\-.*$/,"");
-		name0.textContent = id0 + ": " + name0.textContent;
-	    }
-	}
-
-	// add navigation element
-	var nav = document.createElement("nav");
-	parts[i].insertBefore(nav, parts[i].childNodes[0]);
-    
-	nav.addEventListener("dblclick", function() {
-	    if (this.parentNode.classList.contains("collapsed")) {
-		var parts = document.querySelectorAll("category, subcategory");
-		for (var i = 0; i < parts.length; i++) {
-		    parts[i].classList.remove("collapsed");
-		}
-	    } else {
-		var parts = document.querySelectorAll("category, subcategory");
-		for (var i = 0; i < parts.length; i++) {
-		    parts[i].classList.add("collapsed");
-		}
-	    }
-	});
-
-	nav.addEventListener("click", function() {
-	    this.parentNode.classList.toggle("collapsed");
-	});
-
-	parts[i].classList.add("collapsed");
-
-    }
-
     recalcTodo();
 }
 
 
+
 function copy_to_edit(id) {
     pelleditor.content.innerHTML = document.getElementById(id).innerHTML;
 }
-
diff --git a/web/pell.js b/web/pell.js
index c4f9024..e858b74 100644
--- a/web/pell.js
+++ b/web/pell.js
@@ -179,7 +179,8 @@ var init = function init(settings) {
   };
   content.onkeydown = function (event) {
     if (event.key === "Escape") {
-	docancel();
+	//docancel();
+	editor.style.display = "none";
     }
     if (event.key === 'Enter' && queryCommandValue(formatBlock) === 'blockquote') {
       setTimeout(function () {
diff --git a/web/show.css b/web/show.css
index d25c552..126567c 100644
--- a/web/show.css
+++ b/web/show.css
@@ -3,16 +3,24 @@ styleguide {
     font-family: Helvetica, Arial, Geneva, sans-serif;
 }
 
-styleguide chapter p, styleguide chapter h1, styleguide chapter h2, styleguide chapter h3, styleguide chapter h4, styleguide chapter ol, styleguide chapter ul, styleguide chapter {
+styleguide chapter p,
+styleguide chapter h1, styleguide chapter h2, styleguide chapter h3, styleguide chapter h4,
+styleguide chapter ol, styleguide chapter ul,
+styleguide chapter {
     margin-left: 0.7em;
 }
 
+styleguide chapter {
+    padding: 0px;
+    margin: 0px;
+}
+
 /* the following rules are copied from standard html rules */
 
 styleguide p {
     display: block;
-    margin-block-start: 1em;
-    margin-block-end: 1em;
+    margin-top: 1em;
+    margin-bottom: 1em;
 }
 
 styleguide h2 {
@@ -35,17 +43,17 @@ styleguide h4 {
 styleguide ol {
     display: block;
     list-style-type: decimal;
-    margin-block-start: 1em;
-    margin-block-end: 1em;
-    padding-inline-start: 40px;
+    margin-top: 1em;
+    margin-bottom: 1em;
+    padding-left: 40px;
 }
 
 styleguide ul {
     display: block;
     list-style-type: disc;
-    margin-block-start: 1em;
-    margin-block-end: 1em;
-    padding-inline-start: 40px;
+    margin-top: 1em;
+    margin-bottom: 1em;
+    padding-left: 40px;
 }
 
 styleguide a {
@@ -244,7 +252,6 @@ styleguide entry-instructions,
 styleguide commercial-examples,
 styleguide tags,
 styleguide strength-classifications {
-  position: relative;
   margin-left: 1em;
   display: block;
 }
@@ -295,12 +302,7 @@ styleguide specs ibu, styleguide specs srm, styleguide specs og, styleguide spec
 /* navigation */
 
 styleguide nav {
-  cursor: pointer;
-}
-
-styleguide nav,
-styleguide nav,
-styleguide nav {
+    cursor: pointer;
     display:inline-block;
     position: absolute;
     left:5px;
@@ -309,7 +311,6 @@ styleguide nav {
     margin-top:3px;
     width:20px;
     height:20px;
-    transform: rotate(0deg);
     transition: -webkit-transform 0.3s cubic-bezier(0.19, 1, 0.22, 1);
     transition: transform 0.3s cubic-bezier(0.19, 1, 0.22, 1);
     background-position: center;
@@ -318,37 +319,45 @@ styleguide nav {
     background-image: url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 320 512%27%3E%3Cpath fill=%27%23003f57%27 d=%27M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.2 9.4-24.4 9.4-33.8 0z%27/%3E%3C/svg%3E");
 }
 
-styleguide chapter.collapsed > nav,
-styleguide category.collapsed > nav,
-styleguide subcategory.collapsed > nav {
+styleguide *.collapsed > nav {
+    -webkit-transform: rotate(-90deg);
     transform: rotate(-90deg);
 }
 
+
+styleguide *.uncollapsed > nav {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+}
+
 styleguide chapter.collapsed,
 styleguide category.collapsed,
 styleguide subcategory.collapsed {
     overflow: hidden;
 }
 
+styleguide *.collapsed div.table,
 styleguide *.collapsed * {
-    display:none !important;
+    display:none;
 }
 styleguide *.collapsed nav,
 styleguide *.collapsed h2,
 styleguide *.collapsed name {
-    display:block !important;
+    display:block;
 }
 
 styleguide category > *:nth-child(3),
 styleguide subcategory > *:nth-child(3) {
     /* spacing after "name" and "nav" */
-    margin-block-start: 1em;
+    margin-top: 1em;
 }
+
 styleguide * *:last-child {
-    margin-block-end: 1em;
+    margin-bottom: 1em;
 }
+
 styleguide subcategory[id="7C"] entry-instructions,
 styleguide subcategory[id="21B"] strength-classifications {
     /* layout hack for these single occurances */
-    margin-block-end: 1em;
+    margin-bottom: 1em;
 }
diff --git a/web/show.js b/web/show.js
index f010918..7ed5729 100644
--- a/web/show.js
+++ b/web/show.js
@@ -12,10 +12,13 @@ xhr1.onreadystatechange = function() {
 	    idref = window.location.href.replace(/^.*#/g, '');
 	    var node = document.querySelector("*[id='" + idref + "']");
 	    node.classList.remove("collapsed");
+	    node.classList.add("uncollapsed");
 	    if ((node.parentNode.tagName == "subcategory") || (node.parentNode.tagName == "category")) {
 		node.parentNode.classList.remove("collapsed");
+		node.parentNode.classList.add("uncollapsed");
 		if (node.parentNode.parentNode.tagName == "category") {
 		    node.parentNode.parentNode.classList.remove("collapsed");
+		    node.parentNode.parentNode.classList.add("uncollapsed");
 		}
 	    }
 	    window.location.href = "#" + idref;
@@ -55,20 +58,24 @@ function renderStyleguide(styleguide) {
 		var parts = document.querySelectorAll("category, subcategory");
 		for (var i = 0; i < parts.length; i++) {
 		    parts[i].classList.remove("collapsed");
+		    parts[i].classList.add("uncollapsed");
 		}
 	    } else {
 		var parts = document.querySelectorAll("category, subcategory");
 		for (var i = 0; i < parts.length; i++) {
 		    parts[i].classList.add("collapsed");
+		    parts[i].classList.remove("uncollapsed");
 		}
 	    }
 	});
 
 	nav.addEventListener("click", function() {
 	    this.parentNode.classList.toggle("collapsed");
+	    this.parentNode.classList.toggle("uncollapsed");
 	});
 
 	parts[i].classList.add("collapsed");
+	parts[i].classList.remove("uncollapsed");
 
     }
 
diff --git a/xsl/bjcp-2015-styleguide-doc-to-xml.xsl b/xsl/bjcp-2015-styleguide-doc-to-xml.xsl
index 0f85b03..27832a9 100644
--- a/xsl/bjcp-2015-styleguide-doc-to-xml.xsl
+++ b/xsl/bjcp-2015-styleguide-doc-to-xml.xsl
@@ -708,7 +708,7 @@
 	<xsl:when test="local-name(.) = 'tbl'">
 	  <xsl:element name="div">
 	    <xsl:attribute name="class">
-	      <xsl:text>table-2</xsl:text>
+	      <xsl:text>table</xsl:text>
 	    </xsl:attribute>
 	    <xsl:for-each select="w:tr">
 	      <xsl:choose>
@@ -744,7 +744,7 @@
 	<xsl:when test="w:r[1]/w:t='Straw'">
 	  <xsl:element name="div">
 	    <xsl:attribute name="class">
-	      <xsl:text>table-2</xsl:text>
+	      <xsl:text>table</xsl:text>
 	    </xsl:attribute>
 	    <xsl:for-each select="w:r[not(w:tab)]">
 	      <xsl:element name="div">
-- 
GitLab