`}},
...options
}
- if ('ressourceMapper' in options) {
+ if ('ressourceMapper' in options && typeof options.ressourceMapper === 'function') {
this.ressourceMapper = options.ressourceMapper;
delete options.ressourceMapper;
}
- if ('initialHtmlGenerator' in options) {
+ if ('initialHtmlGenerator' in options && typeof options.initialHtmlGenerator === 'function') {
this.initialHtmlGenerator = options.initialHtmlGenerator;
listElement.innerHTML = this.initialHtmlGenerator(listElement.id);
delete options.initialHtmlGenerator;
diff --git a/app/static/js/XMLtoObject.js b/app/static/js/XMLtoObject.js
new file mode 100644
index 00000000..001376cb
--- /dev/null
+++ b/app/static/js/XMLtoObject.js
@@ -0,0 +1,102 @@
+/**
+ * XMLtoObject - Converts XML into a JavaScript value or object.
+ * GitHub: https://github.com/Pevtrick/XMLtoObject
+ * by Patrick Jentsch: https://github.com/Pevtrick
+ */
+
+/**
+ * The XMLDocument.toObject() method converts the XMLDocument into a JavaScript value or object.
+ * @param {String} [attributePrefix=] - A Prefix, which is added to all properties generated by XML attributes.
+ * @returns {Object} - The converted result.
+ */
+ XMLDocument.prototype.toObject = function(attributePrefix='') {
+ let obj = {};
+
+ obj[this.documentElement.nodeName] = this.documentElement.toObject(attributePrefix);
+
+ return obj;
+};
+
+/**
+* The Node.toObject() method converts the Node into a JavaScript value or object.
+* @param {String} [attributePrefix=] - A Prefix, which is added to all properties generated by XML attributes.
+* @returns {Object|String|null} - The converted result.
+*/
+Node.prototype.toObject = function(attributePrefix='') {
+ let obj = null;
+
+ switch (this.nodeType) {
+ case Node.ELEMENT_NODE:
+ let hasAttributes = this.attributes.length > 0;
+ let hasChildNodes = this.childNodes.length > 0;
+
+ /* Stop conversion if the Node doesn't contain any attributes or child nodes */
+ if (!(hasAttributes || hasChildNodes)) {
+ break;
+ }
+
+ obj = {};
+
+ /* Convert attributes */
+ for (let attribute of this.attributes) {
+ obj[`attributePrefix${attribute.name}`] = attribute.value;
+ }
+
+ /* Convert child nodes */
+ for (let childNode of this.childNodes) {
+ switch (childNode.nodeType) {
+ case Node.ELEMENT_NODE:
+ break;
+ case Node.TEXT_NODE:
+ /* Check whether the child text node is the only child of the current node. */
+ if (!hasAttributes && this.childNodes.length === 1) {
+ obj = childNode.toObject(attributePrefix);
+ continue;
+ }
+ if (childNode.data.trim() === '') {continue;}
+ break;
+ default:
+ /* This recursion leads to a console message. */
+ childNode.toObject(attributePrefix);
+ continue;
+ }
+ /**
+ * If the child node is the first of its type in this childset,
+ * process it and add it directly as a property to the return object.
+ * If not add it to an array which is set as a property of the return object.
+ */
+ if (childNode.nodeName in obj) {
+ if (!Array.isArray(obj[childNode.nodeName])) {
+ obj[childNode.nodeName] = [obj[childNode.nodeName]];
+ }
+ obj[childNode.nodeName].push(childNode.toObject(attributePrefix));
+ } else {
+ obj[childNode.nodeName] = childNode.toObject(attributePrefix);
+ }
+ }
+ break;
+ case Node.TEXT_NODE:
+ if (this.data.trim() !== '') {obj = this.data;}
+ break;
+ case Node.COMMENT_NODE:
+ console.log('Skipping comment node:');
+ console.log(node);
+ break;
+ case Node.DOCUMENT_NODE:
+ obj = {};
+ obj[this.documentElement.nodeName] = this.documentElement.toObject(attributePrefix);
+ break;
+ default:
+ /**
+ * The following node types are not processed because they don't offer data, which has to be stored in the object:
+ * Node.PROCESSING_INSTRUCTION_NODE, Node.DOCUMENT_TYPE_NODE, Node.DOCUMENT_FRAGMENT_NODE
+ * The following node types are deprecated and therefore not supported by this function:
+ * Node.ATTRIBUTE_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE, Node.ENTITY_NODE, Node.NOTATION_NODE
+ */
+ console.log(`Node type: '${this.nodeType}' is not supported.`);
+ console.log(node);
+ break;
+ }
+
+ return obj;
+}
diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2
index 8ff90c33..24d24d97 100644
--- a/app/templates/_scripts.html.j2
+++ b/app/templates/_scripts.html.j2
@@ -24,10 +24,10 @@
'js/RessourceLists/JobList.js',
'js/RessourceLists/JobInputList.js',
'js/RessourceLists/JobResultList.js',
- 'js/RessourceLists/PublicCorporaList.js',
'js/RessourceLists/SpacyNLPPipelineModelList.js',
'js/RessourceLists/TesseractOCRPipelineModelList.js',
- 'js/RessourceLists/UserList.js'
+ 'js/RessourceLists/UserList.js',
+ 'js/XMLtoObject.js'
%}
{%- endassets %}
@@ -53,7 +53,7 @@
// Initialize components
M.AutoInit();
- M.CharacterCounter.init(document.querySelectorAll('input[data-length][type="text"], input[data-length][type="email"], input[data-length][type="search"], input[data-length][type="password"], input[data-length][type="tel"], input[data-length][type="url"], textarea[data-length]'));
+ M.CharacterCounter.init(document.querySelectorAll('input[data-length], textarea[data-length]'));
M.Dropdown.init(
document.querySelectorAll('#nav-more-dropdown-trigger'),
{alignment: 'right', constrainWidth: false, coverTrigger: false}
diff --git a/app/templates/corpora/corpora.html.j2 b/app/templates/corpora/corpora.html.j2
index 8cc701f8..9be377f3 100644
--- a/app/templates/corpora/corpora.html.j2
+++ b/app/templates/corpora/corpora.html.j2
@@ -1,30 +1,46 @@
{% extends "base.html.j2" %}
+{% block main_attribs %} class="service-scheme" data-service="corpus-analysis"{% endblock main_attribs %}
+
{% block page_content %}
-