From 817a13dfffe45cd1469b4d6b5c38484249879de0 Mon Sep 17 00:00:00 2001
From: Patrick Jentsch <p.jentsch@uni-bielefeld.de>
Date: Fri, 21 Apr 2023 15:00:54 +0200
Subject: [PATCH] First take on cleaning up the corpus analysis template code

---
 app/templates/corpora/analysis.html.j2        | 80 +++++++-----------
 .../concordance.html.j2                       | 81 +++++++++++++++----
 .../reader.html.j2                            | 24 +++++-
 .../analysis_extensions/template.html.j2      | 26 ++++++
 4 files changed, 145 insertions(+), 66 deletions(-)
 rename app/templates/corpora/{_analysis => analysis_extensions}/concordance.html.j2 (61%)
 rename app/templates/corpora/{_analysis => analysis_extensions}/reader.html.j2 (83%)
 create mode 100644 app/templates/corpora/analysis_extensions/template.html.j2

diff --git a/app/templates/corpora/analysis.html.j2 b/app/templates/corpora/analysis.html.j2
index dcb42b9f..757e3a54 100644
--- a/app/templates/corpora/analysis.html.j2
+++ b/app/templates/corpora/analysis.html.j2
@@ -1,12 +1,19 @@
 {% extends "base.html.j2" %}
 {% import "materialize/wtf.html.j2" as wtf %}
+{% import 'corpora/analysis_extensions/concordance.html.j2' as concordance_extension %}
+{% import 'corpora/analysis_extensions/reader.html.j2' as reader_extension %}
+
+{% set extensions = [concordance_extension, reader_extension] %}
 {% block main_attribs %} class="service-scheme" data-service="corpus-analysis" id="corpus-analysis-app-container"{% endblock main_attribs %}
 
+
+
 {% block page_content %}
 <ul class="row tabs no-autoinit" id="corpus-analysis-app-extension-tabs">
   <li class="tab col s3"><a class="active" href="#corpus-analysis-app-overview"><i class="nopaque-icons service-icons left" data-service="corpus-analysis"></i>Corpus analysis</a></li>
-  <li class="tab col s3"><a href="#concordance-extension-container"><i class="material-icons left">list_alt</i>Concordance</a></li>
-  <li class="tab col s3"><a href="#reader-extension-container"><i class="material-icons left">chrome_reader_mode</i>Reader</a></li>
+  {% for extension in extensions %}
+  <li class="tab col s3"><a href="#{{ extension.id_prefix }}-container">{{ extension.tab_content }}</a></li>
+  {% endfor %}
 </ul>
 
 <div class="row" id="corpus-analysis-app-overview">
@@ -14,29 +21,23 @@
     <h1>{{ title }}</h1>
   </div>
 
+  {% for extension in extensions %}
   <div class="col s3">
-    <div class="card extension-selector hoverable" data-target="concordance-extension-container">
-      <div class="card-content">
-        <span class="card-title"><i class="material-icons left">list_alt</i>Concordance</span>
-        <p>Query your corpus with the CQP query language utilizing a KWIC view.</p>
-      </div>
-    </div>
-  </div>
-
-  <div class="col s3">
-    <div class="card extension-selector hoverable" data-target="reader-extension-container">
+    <div class="card extension-selector hoverable" data-target="{{ extension.id_prefix }}-container">
       <div class="card-content">
-        <span class="card-title"><i class="material-icons left">chrome_reader_mode</i>Reader</span>
-        <p>Inspect your corpus in detail with a full text view, including annotations.</p>
+        <span class="card-title">{{ extension.name }}</span>
+        <p>{{ extension.description }}</p>
       </div>
     </div>
   </div>
+  {% endfor %}
 </div>
 
-{#  #}
-{% include "corpora/_analysis/reader.html.j2" %}
-
-{% include "corpora/_analysis/concordance.html.j2" %}
+{% for extension in extensions %}
+<div id="{{ extension.id_prefix }}-container">
+  {{ extension.container_content }}
+</div>
+{% endfor %}
 {% endblock page_content %}
 
 {% block modals %}
@@ -54,33 +55,9 @@
   </div>
 </div>
 
-<div class="modal" id="example-modal">
-  <div class="modal-content">
-    <div class="row">
-      <div class="col s12">
-        <h4>Examples</h4>
-        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 
-        tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero 
-        eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea 
-        takimata sanctus est Lorem ipsum dolor sit amet.</p>
-      </div>
-      <div class="col s8">
-        <table>
-          <tr>
-            <th>You are looking for...</th>
-            <th>Type in:</th>
-            <th>Result:</th>
-          </tr>
-          <tr>
-            <td>The word "begin" </td>
-            <td>[word="begin"];</td>
-            <td><a class="tooltipped" data-position="bottom" data-tooltip="List all examples of the word within a corpus that you searched for.">Concordance</a> of the word begin</td>
-          </tr>
-        </table>
-      </div>
-    </div>
-  </div>
-</div>
+{% for extension in extensions %}
+{{ extension.modals }}
+{% endfor %}
 
 <div class="modal" id="concordance-query-builder">
   <div class="modal-content">
@@ -409,11 +386,14 @@
 {% block scripts %}
 {{ super() }}
 <script>
-const corpusAnalysisApp = new CorpusAnalysisApp({{ corpus.hashid|tojson }});
-const corpusAnalysisConcordance = new CorpusAnalysisConcordance(corpusAnalysisApp);
-const corpusAnalysisReader = new CorpusAnalysisReader(corpusAnalysisApp);
-const concordanceQueryBuilder = new ConcordanceQueryBuilder();
+  const corpusAnalysisApp = new CorpusAnalysisApp({{ corpus.hashid|tojson }});
+</script>
 
-corpusAnalysisApp.init();
+{% for extension in extensions %}
+{{ extension.scripts }}
+{% endfor %}
+
+<script>
+  corpusAnalysisApp.init();
 </script>
 {% endblock scripts %}
diff --git a/app/templates/corpora/_analysis/concordance.html.j2 b/app/templates/corpora/analysis_extensions/concordance.html.j2
similarity index 61%
rename from app/templates/corpora/_analysis/concordance.html.j2
rename to app/templates/corpora/analysis_extensions/concordance.html.j2
index 2fa63377..5886a4b1 100644
--- a/app/templates/corpora/_analysis/concordance.html.j2
+++ b/app/templates/corpora/analysis_extensions/concordance.html.j2
@@ -1,24 +1,37 @@
-<div class="row" id="concordance-extension-container">
+{% set name = 'Concordance' %}
+
+{% set description %}
+Query your corpus with the CQP query language utilizing a KWIC view.
+{% endset %}
+
+{% set id_prefix = name.lower().replace(' ', '-') + '-extension' %}
+
+{% set tab_content %}
+<i class="material-icons left">list_alt</i>{{ name }}</a>
+{% endset %}
+
+{% set container_content %}
+<div class="row">
   <div class="col s12">
     <div class="card">
       <div class="card-content">
-        <form id="concordance-extension-form">
+        <form id="{{ id_prefix }}-form">
           <div class="row">
             <div class="input-field col s12 m9">
               <i class="material-icons prefix">search</i>
-              <input class="validate corpus-analysis-action" id="concordance-extension-form-query" name="query" type="text" required pattern=".*\S+.*" placeholder="Type in your query or use the Query Builder on the right"</input>
-              <label for="concordance-extension-form-query">Query</label>
-              <span class="error-color-text helper-text hide" id="concordance-extension-error"></span>
+              <input class="validate corpus-analysis-action" id="{{ id_prefix }}-form-query" name="query" type="text" required pattern=".*\S+.*" placeholder="Type in your query or use the Query Builder on the right"</input>
+              <label for="{{ id_prefix }}-form-query">Query</label>
+              <span class="error-color-text helper-text hide" id="{{ id_prefix }}-error"></span>
               <a class="modal-trigger" data-manual-modal-chapter="manual-modal-cqp-query-language" href="#manual-modal" style="margin-left: 40px;"><i class="material-icons" style="font-size: inherit;">help</i> Corpus Query Language tutorial</a>
               <span> | </span>
               <a class="modal-trigger" data-manual-modal-chapter="manual-modal-tagsets" href="#manual-modal"><i class="material-icons" style="font-size: inherit;">info</i> Tagsets</a>
               <span> | </span>
-              <a class="modal-trigger" href="#example-modal"><i class="material-icons" style="font-size: inherit;">info</i> Examples</a>
+              <a class="modal-trigger" href="#{{ id_prefix }}-example-modal"><i class="material-icons" style="font-size: inherit;">info</i> Examples</a>
             </div>
             <div class="input-field col s12 m3">
               <i class="material-icons prefix">arrow_forward</i>
-              <input class="validate corpus-analysis-action" id="concordance-extension-form-subcorpus-name" name="subcorpus-name" type="text" required pattern="^[A-Z][a-z0-9\-]*" value="Last"></input>
-              <label for="concordance-extension-form-subcorpus-name">Subcorpus name</label>
+              <input class="validate corpus-analysis-action" id="{{ id_prefix }}-form-subcorpus-name" name="subcorpus-name" type="text" required pattern="^[A-Z][a-z0-9\-]*" value="Last"></input>
+              <label for="{{ id_prefix }}-form-subcorpus-name">Subcorpus name</label>
             </div>
             <div class="col s12 m9 l9">
               <div class="row">
@@ -70,7 +83,7 @@
                 <i class="material-icons left">build</i>
                 Query builder (beta)
               </a>
-              <button class="btn waves-effect waves-light corpus-analysis-action" id="concordance-extension-form-submit" type="submit" name="submit">
+              <button class="btn waves-effect waves-light corpus-analysis-action" id="{{ id_prefix }}-form-submit" type="submit" name="submit">
                 Send 
                 <i class="material-icons right">send</i>
               </button>
@@ -82,16 +95,16 @@
   </div>
 
   <div class="col s12">
-    <div id="concordance-extension-subcorpus-list"></div>
+    <div id="{{ id_prefix }}-subcorpus-list"></div>
 
     <div class="card">
       <div class="card-content">
-        <div class="progress hide" id="concordance-extension-progress">
+        <div class="progress hide" id="{{ id_prefix }}-progress">
           <div class="indeterminate"></div>
         </div>
         <div class="row">
-          <div class="col s9"><p class="hide" id="concordance-extension-subcorpus-info"></p></div>
-          <div class="col s3 right-align" id="concordance-extension-subcorpus-actions"></div>
+          <div class="col s9"><p class="hide" id="{{ id_prefix }}-subcorpus-info"></p></div>
+          <div class="col s3 right-align" id="{{ id_prefix }}-subcorpus-actions"></div>
         </div>
         <table class="highlight">
           <thead>
@@ -104,10 +117,48 @@
               <th class="left-align" style="width: 5%;"></th>
             </tr>
           </thead>
-          <tbody id="concordance-extension-subcorpus-items"></tbody>
+          <tbody id="{{ id_prefix }}-subcorpus-items"></tbody>
+        </table>
+        <ul class="pagination hide" id="{{ id_prefix }}-subcorpus-pagination"></ul>
+      </div>
+    </div>
+  </div>
+</div>
+{% endset %}
+
+{% set modals %}
+<div class="modal" id="{{ id_prefix }}-example-modal">
+  <div class="modal-content">
+    <div class="row">
+      <div class="col s12">
+        <h4>Examples</h4>
+        <p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod 
+        tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero 
+        eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea 
+        takimata sanctus est Lorem ipsum dolor sit amet.</p>
+      </div>
+      <div class="col s8">
+        <table>
+          <tr>
+            <th>You are looking for...</th>
+            <th>Type in:</th>
+            <th>Result:</th>
+          </tr>
+          <tr>
+            <td>The word "begin" </td>
+            <td>[word="begin"];</td>
+            <td><a class="tooltipped" data-position="bottom" data-tooltip="List all examples of the word within a corpus that you searched for.">Concordance</a> of the word begin</td>
+          </tr>
         </table>
-        <ul class="pagination hide" id="concordance-extension-subcorpus-pagination"></ul>
       </div>
     </div>
   </div>
 </div>
+{% endset %}
+
+{% set scripts %}
+<script>
+  const corpusAnalysisConcordance = new CorpusAnalysisConcordance(corpusAnalysisApp);
+  const concordanceQueryBuilder = new ConcordanceQueryBuilder();
+</script>
+{% endset %}
diff --git a/app/templates/corpora/_analysis/reader.html.j2 b/app/templates/corpora/analysis_extensions/reader.html.j2
similarity index 83%
rename from app/templates/corpora/_analysis/reader.html.j2
rename to app/templates/corpora/analysis_extensions/reader.html.j2
index a4ca22fb..683435f9 100644
--- a/app/templates/corpora/_analysis/reader.html.j2
+++ b/app/templates/corpora/analysis_extensions/reader.html.j2
@@ -1,4 +1,17 @@
-<div class="row" id="reader-extension-container">
+{% set name = 'Reader' %}
+
+{% set description %}
+Inspect your corpus in detail with a full text view, including annotations.
+{% endset %}
+
+{% set id_prefix = name.lower().replace(' ', '-') + '-extension' %}
+
+{% set tab_content %}
+<i class="material-icons left">chrome_reader_mode</i>{{ name }}</a>
+{% endset %}
+
+{% set container_content %}
+<div class="row">
   <div class="col s12">
     <div class="card">
       <div class="card-content">
@@ -65,3 +78,12 @@
     </div>
   </div>
 </div>
+{% endset %}
+
+{% set modals = '' %}
+
+{% set scripts %}
+<script>
+  const corpusAnalysisReader = new CorpusAnalysisReader(corpusAnalysisApp);
+</script>
+{% endset %}
diff --git a/app/templates/corpora/analysis_extensions/template.html.j2 b/app/templates/corpora/analysis_extensions/template.html.j2
new file mode 100644
index 00000000..00565b16
--- /dev/null
+++ b/app/templates/corpora/analysis_extensions/template.html.j2
@@ -0,0 +1,26 @@
+
+{# The extension name #}
+{% set name = '' %}
+
+{# The extension description #}
+{% set description = '' %}
+
+{# 
+  The extension id prefix, used for related HTML elements with an id.
+  The prefix is used to avoid id conflicts with other extensions.
+  Reserved ids (do not use):
+    - <id_prefix>-extension-container
+#}
+{% set id_prefix = name.lower().replace(' ', '-') + '-extension' %}
+
+{# The extension tab content #}
+{% set tab_content = name %}
+
+{# The extension container content #}
+{% set container_content = '' %}
+
+{# The extension modals #}
+{% set modals = '' %}
+
+{# The extension scripts #}
+{% set scripts = '' %}
-- 
GitLab