intermediate

This commit is contained in:
Patrick Jentsch 2020-10-23 08:51:46 +02:00
parent 0ef7355ca1
commit 23441dab2e
19 changed files with 1249 additions and 1149 deletions

View File

@ -0,0 +1,12 @@
/*
* The sidenav-fixed class is used which causes the sidenav to be fixed and open
* on large screens and hides to the regular functionality on smaller screens.
* In order to prevent the sidenav to overlap the content, the content (in our
* case header, main and footer) gets an offset equal to the width of the
* sidenav.
*/
@media only screen and (min-width : 993px) {
header, main, footer {padding-left: 300px;}
.modal:not(.bottom-sheet) {left: 300px;}
.navbar-fixed > nav {width: calc(100% - 300px)}
}

View File

@ -0,0 +1,13 @@
/*
* Force the footer to always stay on the bottom of the page regardless of how
* little content is on the page.
*/
body {
display: flex;
min-height: 100vh;
flex-direction: column;
}
main {
flex: 1 0 auto;
}

View File

@ -1,19 +1,3 @@
/*
* ### Start sticky footer ###
* Force the footer to always stay on the bottom of the page regardless of how
* little content is on the page.
*/
body {
display: flex;
min-height: 100vh;
flex-direction: column;
}
main {
flex: 1 0 auto;
}
/* ### End sticky footer ### */
/* add custom bold class */
.bold {
font-weight: bold;

View File

@ -4,12 +4,8 @@
*/
var nopaque = {};
// nopaque ressources
nopaque.socket = undefined;
// User data
nopaque.user = {};
nopaque.user.isAuthenticated = undefined;
nopaque.user.settings = {};
nopaque.user.settings.darkMode = undefined;
nopaque.corporaSubscribers = [];
@ -25,81 +21,76 @@ nopaque.foreignCorporaSubscribers = [];
nopaque.foreignJobsSubscribers = [];
nopaque.foreignQueryResultsSubscribers = [];
nopaque.flashedMessages = undefined;
// nopaque functions
nopaque.socket = {};
nopaque.socket.init = function() {
nopaque.socket = io({transports: ['websocket']});
// Add event handlers
nopaque.socket.on("user_data_stream_init", function(msg) {
nopaque.user = JSON.parse(msg);
for (let subscriber of nopaque.corporaSubscribers) {
subscriber._init(nopaque.user.corpora);
}
for (let subscriber of nopaque.jobsSubscribers) {
subscriber._init(nopaque.user.jobs);
}
for (let subscriber of nopaque.queryResultsSubscribers) {
subscriber._init(nopaque.user.query_results);
}
});
nopaque.socket = io({transports: ['websocket']});
// Add event handlers
nopaque.socket.on("user_data_stream_init", function(msg) {
nopaque.user = JSON.parse(msg);
for (let subscriber of nopaque.corporaSubscribers) {
subscriber._init(nopaque.user.corpora);
}
for (let subscriber of nopaque.jobsSubscribers) {
subscriber._init(nopaque.user.jobs);
}
for (let subscriber of nopaque.queryResultsSubscribers) {
subscriber._init(nopaque.user.query_results);
}
});
nopaque.socket.on("user_data_stream_update", function(msg) {
var patch;
nopaque.socket.on("user_data_stream_update", function(msg) {
var patch;
patch = JSON.parse(msg);
nopaque.user = jsonpatch.apply_patch(nopaque.user, patch);
corpora_patch = patch.filter(operation => operation.path.startsWith("/corpora"));
jobs_patch = patch.filter(operation => operation.path.startsWith("/jobs"));
query_results_patch = patch.filter(operation => operation.path.startsWith("/query_results"));
for (let subscriber of nopaque.corporaSubscribers) {
subscriber._update(corpora_patch);
}
for (let subscriber of nopaque.jobsSubscribers) {
subscriber._update(jobs_patch);
}
for (let subscriber of nopaque.queryResultsSubscribers) {
subscriber._update(query_results_patch);
}
if (["all", "end"].includes(nopaque.user.settings.job_status_site_notifications)) {
for (operation of jobs_patch) {
/* "/jobs/{jobId}/..." -> ["{jobId}", ...] */
pathArray = operation.path.split("/").slice(2);
if (operation.op === "replace" && pathArray[1] === "status") {
if (nopaque.user.settings.job_status_site_notifications === "end" && !["complete", "failed"].includes(operation.value)) {continue;}
nopaque.flash(`[<a href="/jobs/${pathArray[0]}">${nopaque.user.jobs[pathArray[0]].title}</a>] New status: ${operation.value}`, "job");
}
patch = JSON.parse(msg);
nopaque.user = jsonpatch.apply_patch(nopaque.user, patch);
corpora_patch = patch.filter(operation => operation.path.startsWith("/corpora"));
jobs_patch = patch.filter(operation => operation.path.startsWith("/jobs"));
query_results_patch = patch.filter(operation => operation.path.startsWith("/query_results"));
for (let subscriber of nopaque.corporaSubscribers) {
subscriber._update(corpora_patch);
}
for (let subscriber of nopaque.jobsSubscribers) {
subscriber._update(jobs_patch);
}
for (let subscriber of nopaque.queryResultsSubscribers) {
subscriber._update(query_results_patch);
}
if (["all", "end"].includes(nopaque.user.settings.job_status_site_notifications)) {
for (operation of jobs_patch) {
/* "/jobs/{jobId}/..." -> ["{jobId}", ...] */
pathArray = operation.path.split("/").slice(2);
if (operation.op === "replace" && pathArray[1] === "status") {
if (nopaque.user.settings.job_status_site_notifications === "end" && !["complete", "failed"].includes(operation.value)) {continue;}
nopaque.flash(`[<a href="/jobs/${pathArray[0]}">${nopaque.user.jobs[pathArray[0]].title}</a>] New status: ${operation.value}`, "job");
}
}
});
}
});
nopaque.socket.on("foreign_user_data_stream_init", function(msg) {
nopaque.foreignUser = JSON.parse(msg);
for (let subscriber of nopaque.foreignCorporaSubscribers) {
subscriber._init(nopaque.foreignUser.corpora);
}
for (let subscriber of nopaque.foreignJobsSubscribers) {
subscriber._init(nopaque.foreignUser.jobs);
}
for (let subscriber of nopaque.foreignQueryResultsSubscribers) {
subscriber._init(nopaque.foreignUser.query_results);
}
});
nopaque.socket.on("foreign_user_data_stream_init", function(msg) {
nopaque.foreignUser = JSON.parse(msg);
for (let subscriber of nopaque.foreignCorporaSubscribers) {
subscriber._init(nopaque.foreignUser.corpora);
}
for (let subscriber of nopaque.foreignJobsSubscribers) {
subscriber._init(nopaque.foreignUser.jobs);
}
for (let subscriber of nopaque.foreignQueryResultsSubscribers) {
subscriber._init(nopaque.foreignUser.query_results);
}
});
nopaque.socket.on("foreign_user_data_stream_update", function(msg) {
var patch;
nopaque.socket.on("foreign_user_data_stream_update", function(msg) {
var patch;
patch = JSON.parse(msg);
nopaque.foreignUser = jsonpatch.apply_patch(nopaque.foreignUser, patch);
corpora_patch = patch.filter(operation => operation.path.startsWith("/corpora"));
jobs_patch = patch.filter(operation => operation.path.startsWith("/jobs"));
query_results_patch = patch.filter(operation => operation.path.startsWith("/query_results"));
for (let subscriber of nopaque.foreignCorporaSubscribers) {subscriber._update(corpora_patch);}
for (let subscriber of nopaque.foreignJobsSubscribers) {subscriber._update(jobs_patch);}
for (let subscriber of nopaque.foreignQueryResultsSubscribers) {subscriber._update(query_results_patch);}
});
}
patch = JSON.parse(msg);
nopaque.foreignUser = jsonpatch.apply_patch(nopaque.foreignUser, patch);
corpora_patch = patch.filter(operation => operation.path.startsWith("/corpora"));
jobs_patch = patch.filter(operation => operation.path.startsWith("/jobs"));
query_results_patch = patch.filter(operation => operation.path.startsWith("/query_results"));
for (let subscriber of nopaque.foreignCorporaSubscribers) {subscriber._update(corpora_patch);}
for (let subscriber of nopaque.foreignJobsSubscribers) {subscriber._update(jobs_patch);}
for (let subscriber of nopaque.foreignQueryResultsSubscribers) {subscriber._update(query_results_patch);}
});
nopaque.Forms = {};
nopaque.Forms.init = function() {
@ -173,32 +164,10 @@ nopaque.Forms.init = function() {
}
}
nopaque.Navigation = {};
nopaque.Navigation.init = function() {
/* ### Initialize sidenav-main ### */
for (let entry of document.querySelectorAll("#sidenav-main a")) {
if (entry.href === window.location.href) {
entry.parentNode.classList.add("active");
}
}
}
nopaque.flash = function() {
var classes, toast, toastActionElement;
switch (arguments.length) {
case 1:
category = "message";
message = arguments[0];
break;
case 2:
message = arguments[0];
category = arguments[1];
break;
default:
console.error("Usage: nopaque.flash(message) or nopaque.flash(message, category)")
}
nopaque.flash = function(message, category) {
let toast;
let toastActionElement;
switch (category) {
case "corpus":
@ -219,27 +188,5 @@ nopaque.flash = function() {
<i class="material-icons">close</i>
</button>`});
toastActionElement = toast.el.querySelector('.toast-action[data-action="close"]');
if (toastActionElement) {
toastActionElement.addEventListener('click', function() {
toast.dismiss();
});
}
toastActionElement.addEventListener('click', () => {toast.dismiss();});
}
document.addEventListener('DOMContentLoaded', () => {
// Disable all option elements with no value
for (let optionElement of document.querySelectorAll('option[value=""]')) {
optionElement.disabled = true;
}
M.AutoInit();
M.CharacterCounter.init(document.querySelectorAll('input[data-length][type="text"]'));
M.Dropdown.init(document.querySelectorAll('#nav-notifications, #nav-account'),
{alignment: 'right', constrainWidth: false, coverTrigger: false});
nopaque.Forms.init();
nopaque.Navigation.init();
while (nopaque.flashedMessages.length) {
flashedMessage = nopaque.flashedMessages.shift();
nopaque.flash(flashedMessage[1], flashedMessage[0]);
}
});

View File

@ -0,0 +1,19 @@
{% set colors = {'primary': '#00426f',
'secondary': '#b1b3b4',
'corpus_analysis': '#aa9cc9',
'corpus_analysis_darken': '#6b3f89',
'corpus_analysis_lighten': '#ebe8f6',
'file_setup': '#d5dc95',
'file_setup_darken': '#a1b300',
'file_setup_lighten': '#f2f3e1',
'nlp': '#98acd2',
'nlp_darken': '#0064a3',
'nlp_lighten': '#e5e8f5',
'ocr': '#a9d8c8',
'ocr_darken': '#00a58b',
'ocr_lighten': '#e7f4f1'} %}
{% if main_class is not defined %}
{% set main_class = 'grey lighten-5' %}
{% endif %}

View File

@ -1,8 +1,8 @@
{% extends "nopaque.html.j2" %}
{% import 'materialize/wtf.html.j2' as wtf %}
{% set headline = ' ' %}
{% block page_content %}
{% block styles %}
{{ super() }}
<style>
main {
background-image: url("{{ url_for('static', filename='images/parallax_lq/04_german_text_book_paper.jpg') }}");
@ -10,39 +10,45 @@
background-size: cover;
}
</style>
{% endblock styles %}
<div class="col s12 m4">
<div class="card medium">
<div class="card-content">
<h2>Log in</h2>
<p>Want to boost your research and get going? nopaque is free and no download is needed. Register now!</p>
</div>
<div class="card-action right-align">
<a class="btn" href="{{ url_for('auth.register') }}"><i class="material-icons left">person_add</i>Register</a>
</div>
</div>
</div>
<div class="col s12 m8">
<div class="card medium">
<form method="POST">
<div class="card-content">
{{ login_form.hidden_tag() }}
{{ M.render_field(login_form.user, material_icon='person') }}
{{ M.render_field(login_form.password, material_icon='vpn_key') }}
<div class="row" style="margin-bottom: 0;">
<div class="col s6 left-align">
<a href="{{ url_for('auth.reset_password_request') }}">Forgot your password?</a>
</div>
<div class="col s6 right-align">
{{ M.render_field(login_form.remember_me) }}
</div>
{% block page_content %}
<div class="container">
<div class="row">
<div class="col s12 m4">
<div class="card medium">
<div class="card-content">
<h1>{{ title }}</h1>
<p>Want to boost your research and get going? nopaque is free and no download is needed. Register now!</p>
</div>
<div class="card-action right-align">
<a class="btn" href="{{ url_for('.register') }}"><i class="material-icons left">person_add</i>Register</a>
</div>
</div>
<div class="card-action right-align">
{{ M.render_field(login_form.submit, material_icon='send') }}
</div>
<div class="col s12 m8">
<div class="card medium">
<form method="POST">
<div class="card-content">
{{ login_form.hidden_tag() }}
{{ wtf.render_field(login_form.user, material_icon='person') }}
{{ wtf.render_field(login_form.password, material_icon='vpn_key') }}
<div class="row" style="margin-bottom: 0;">
<div class="col s6 left-align">
<a href="{{ url_for('.reset_password_request') }}">Forgot your password?</a>
</div>
<div class="col s6 right-align">
{{ wtf.render_field(login_form.remember_me) }}
</div>
</div>
</div>
<div class="card-action right-align">
{{ wtf.render_field(login_form.submit, material_icon='send') }}
</div>
</form>
</div>
</form>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,8 +1,8 @@
{% extends "nopaque.html.j2" %}
{% import 'materialize/wtf.html.j2' as wtf %}
{% set headline = ' ' %}
{% block page_content %}
{% block styles %}
{{ super() }}
<style>
main {
background-image: url("{{ url_for('static', filename='images/parallax_lq/02_concept_document_focus_letter.jpg') }}");
@ -10,32 +10,38 @@
background-size: cover;
}
</style>
{% endblock styles %}
<div class="col s12 m4">
<div class="card medium">
<div class="card-content">
<h2>Register</h2>
<p>Simply enter a username and password to receive your registration email. After that you can start right away.</p>
<p>It goes without saying that the <a href="{{ url_for('main.privacy_policy') }}">General Data Protection Regulation</a> applies, only necessary data is stored.</p>
<p>Please also read our <a href="{{ url_for('main.terms_of_use') }}">terms of use</a> before signing up for nopaque!</p>
{% block page_content %}
<div class="container">
<div class="row">
<div class="col s12 m4">
<div class="card medium">
<div class="card-content">
<h1>Register</h1>
<p>Simply enter a username and password to receive your registration email. After that you can start right away.</p>
<p>It goes without saying that the <a href="{{ url_for('main.privacy_policy') }}">General Data Protection Regulation</a> applies, only necessary data is stored.</p>
<p>Please also read our <a href="{{ url_for('main.terms_of_use') }}">terms of use</a> before signing up for nopaque!</p>
</div>
</div>
</div>
<div class="col s12 m8">
<div class="card medium">
<form method="POST">
<div class="card-content">
{{ registration_form.hidden_tag() }}
{{ wtf.render_field(registration_form.username, data_length='64', material_icon='person') }}
{{ wtf.render_field(registration_form.password, data_length='128', material_icon='vpn_key') }}
{{ wtf.render_field(registration_form.password_confirmation, data_length='128', material_icon='vpn_key') }}
{{ wtf.render_field(registration_form.email, class_='validate', material_icon='email', type='email') }}
</div>
<div class="card-action right-align">
{{ wtf.render_field(registration_form.submit, material_icon='send') }}
</div>
</form>
</div>
</div>
</div>
</div>
<div class="col s12 m8">
<div class="card medium">
<form method="POST">
<div class="card-content">
{{ registration_form.hidden_tag() }}
{{ M.render_field(registration_form.username, data_length='64', material_icon='person') }}
{{ M.render_field(registration_form.password, data_length='128', material_icon='vpn_key') }}
{{ M.render_field(registration_form.password_confirmation, data_length='128', material_icon='vpn_key') }}
{{ M.render_field(registration_form.email, class_='validate', material_icon='email', type='email') }}
</div>
<div class="card-action right-align">
{{ M.render_field(registration_form.submit, material_icon='send') }}
</div>
</form>
</div>
</div>
{% endblock %}

View File

@ -1,23 +1,31 @@
{% extends "nopaque.html.j2" %}
{% import 'materialize/wtf.html.j2' as wtf %}
{% block page_content %}
<div class="col s12 m4">
<h3>Lorem ipsum</h3>
<p>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,</p>
</div>
<div class="container">
<div class="row">
<div class="col s12">
<h1>{{ title }}</h1>
</div>
<div class="col s12 m8">
<div class="card">
<form method="POST">
<div class="card-content">
{{ reset_password_form.hidden_tag() }}
{{ M.render_field(reset_password_form.password, data_length='128') }}
{{ M.render_field(reset_password_form.password_confirmation, data_length='128') }}
<div class="col s12 m4">
<p>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,</p>
</div>
<div class="col s12 m8">
<div class="card">
<form method="POST">
<div class="card-content">
{{ reset_password_form.hidden_tag() }}
{{ wtf.render_field(reset_password_form.password, data_length='128') }}
{{ wtf.render_field(reset_password_form.password_confirmation, data_length='128') }}
</div>
<div class="card-action right-align">
{{ wtf.render_field(reset_password_form.submit, material_icon='send') }}
</div>
</form>
</div>
<div class="card-action right-align">
{{ M.render_field(reset_password_form.submit, material_icon='send') }}
</div>
</form>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,21 +1,30 @@
{% extends "nopaque.html.j2" %}
{% import 'materialize/wtf.html.j2' as wtf %}
{% block page_content %}
<div class="col s12 m4">
<p>After entering your email address you will receive instructions on how to reset your password.</p>
</div>
<div class="container">
<div class="row">
<div class="col s12">
<h1>{{ title }}</h1>
</div>
<div class="col s12 m8">
<div class="card">
<form method="POST">
<div class="card-content">
{{ reset_password_request_form.hidden_tag() }}
{{ M.render_field(reset_password_request_form.email, class_='validate', material_icon='email', type='email') }}
<div class="col s12 m4">
<p>After entering your email address you will receive instructions on how to reset your password.</p>
</div>
<div class="col s12 m8">
<div class="card">
<form method="POST">
<div class="card-content">
{{ reset_password_request_form.hidden_tag() }}
{{ wtf.render_field(reset_password_request_form.email, class_='validate', material_icon='email', type='email') }}
</div>
<div class="card-action right-align">
{{ wtf.render_field(reset_password_request_form.submit, material_icon='send') }}
</div>
</form>
</div>
<div class="card-action right-align">
{{ M.render_field(reset_password_request_form.submit, material_icon='send') }}
</div>
</form>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,20 +1,25 @@
{% extends "nopaque.html.j2" %}
{% block title %}Opaque - Confirm your account{% endblock %}
{% block page_content %}
<div class="page-header">
<h1>
Hello, {{ current_user.username }}!
</h1>
<h3>You have not confirmed your account yet.</h3>
<p>
Before you can access this site you need to confirm your account.
Check your inbox, you should have received an email with a confirmation link.
</p>
<p>
Need another confirmation email?
<a href="{{ url_for('auth.resend_confirmation') }}">Click here</a>
</p>
<div class="container">
<div class="row">
<div class="col s12">
<h1>{{ title }}</h1>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">Hello, {{ current_user.username }}!</span>
<p><b>You have not confirmed your account yet.</b></p>
<p>Before you can access this site you need to confirm your account. Check your inbox, you should have received an email with a confirmation link.</p>
<p>Need another confirmation email? <a href="{{ url_for('.resend_confirmation') }}">Click here</a></p>
</div>
<div class="card-action right-align">
<a class="btn" href="{{ url_for('.register') }}"><i class="material-icons left">person_add</i>Register</a>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,259 +1,265 @@
{% extends "nopaque.html.j2" %}
{% block page_content %}
<div class="container">
<div class="row">
<div class="col s12">
<h1>{{ title }}</h1>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">What is nopaque</span>
<p>
Our web application nopaque combines coordinated tools such as Optical
Character Recognition (OCR), Natrual Language Processing (NLP) and a
powerful Keyword In Context Search (KWIC) with the CQP query language.
</p>
<br>
<p>
nopaque offers the possibility to use all tools individually or as a
workflow. All work steps are coordinated in such a way that individual
services can be used on top of each other. The platform supports
researchers in converting their files into formats that can be further
processed, automatically enriching them with information and then
analyzing them, so that nopaque maps a large part of the research
processes in the humanities. With this toolbox we address researchers
in the humanities from all disciplines and levels of knowledge.
The data generated during the processes can be downloaded after each
step in order to evaluate or further process them with other (external) tools.
</p>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">What is nopaque</span>
<p>
Our web application nopaque combines coordinated tools such as Optical
Character Recognition (OCR), Natrual Language Processing (NLP) and a
powerful Keyword In Context Search (KWIC) with the CQP query language.
</p>
<br>
<p>
nopaque offers the possibility to use all tools individually or as a
workflow. All work steps are coordinated in such a way that individual
services can be used on top of each other. The platform supports
researchers in converting their files into formats that can be further
processed, automatically enriching them with information and then
analyzing them, so that nopaque maps a large part of the research
processes in the humanities. With this toolbox we address researchers
in the humanities from all disciplines and levels of knowledge.
The data generated during the processes can be downloaded after each
step in order to evaluate or further process them with other (external) tools.
</p>
</div>
</div>
</div>
<div class="col s12">
<ul class="collapsible">
<li>
<div class="collapsible-header">1. Who is developing nopaque?</div>
<div class="collapsible-body">
<span>
<p>
<em>nopaque</em> is developed by a small, interdisciplinary Team at
<em>University Bielefeld</em> called <em>Data Infrastructure and
Digital Humanities (INF)</em>. We are part of the <em>SFB 1288 -
Practices of comparing. Ordering and changing the world</em>.
</p>
<p>For mor information <a href="https://www.uni-bielefeld.de/(en)/sfb1288/">
visit the SFB1288 web site</a> or
<a href="https://www.uni-bielefeld.de/(en)/sfb1288/projekte/inf.html">
our team page</a>.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">2. Is nopaque free to use for everyone?</div>
<div class="collapsible-body">
<span>
<p>
Yes nopaque is free to use for everyone! It does not matter if you
are a researcher in the humanities, a student or just someone who
wants to learn something new. Just <a href="http://nopaque.localhost/auth/register">
sign up for it</a> and try it out!
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">3. How much does it cost to use nopaque?</div>
<div class="collapsible-body">
<span>nopaque and the services provided by it are free of charge.</span>
</div>
<li>
<li>
<div class="collapsible-header">4. Why is nopaque written in lower case?</div>
<div class="collapsible-body">
<span>We just think that nopaque with a lower case first letter looks
better than Nopaque with an upper case first letter. Simple as that!
</span>
</div>
<li>
<li>
<div class="collapsible-header">5. Why the name nopaque?</div>
<div class="collapsible-body">
<span>
<p>
When we started developing nopaque we wanted to have a cool name
like <a href="https://voyant-tools.org/">voyant</a> which can be translated
to light or seeing. So we choose opaque thinking that it means that
something is transparent. After a while we realized that we misunderstood
the meaning of the word (opaque means non-transparent) and simply
negated it ending up with nopaque.
</p>
<p>
We also think nopaque fits pretty nicley because we want you to be
able to make your texts transparent and see through them with our
analysis tool to gain knew knowledge about them.
</p>
</span>
</div>
<li>
<div class="collapsible-header">6. Is nopaque FOSS/Open Source?</div>
<div class="collapsible-body">
<span>Yes nopaque only uses free and open source software (FOSS). You
can find the <a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/opaque">
source code in our gitlab repository</a>.
</span>
</div>
</li>
<li>
<div class="collapsible-header">7. What software/technologies is nopaque using/build with?</div>
<div class="collapsible-body">
<span>
<p>
nopaques frontend (what the user sees) is written in HTML 5
and Javascript. The backend (stuff that happens on our servers)
is realized with <a href="https://palletsprojects.com/p/flask/">
Flask</a>, a python based lightweight WSGI web application
framework. We utilize <a href="https://www.docker.com/">Docker</a>
to easily deploy nopaque on our servers.
</p>
<p>
The client server real time comminication is implemented using
<a href="https://flask-socketio.readthedocs.io/en/latest/">Flask-SocketIO</a>.
</p>
<p>Every service (e.g. OCR or NLP) provided by nopaque is using
established opensource software. Take a look at their related
questions to learn more about them.</p>
<p>
For more details take a look at the
<a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/opaque">source code</a>.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">8. What software/technology is used for the File Setup service?</div>
<div class="collapsible-body">
<span>
<p>
The File Setup service uses <a href="https://imagemagick.org/index.php">ImageMagick</a>
to merge your images into one file.
</p>
<p>
For more details take a look at the
<a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/file-setup">source code</a>.
</p>
</span>
<li>
<div class="collapsible-header">9. What software/technology is used for the OCR service?</div>
<div class="collapsible-body">
<span>
<p>
The OCR service uses <a href="https://github.com/tesseract-ocr/tesseract">Tesseract OCR.</a>
</p>
<p>
For more details take a look at the
<a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/ocr">source code</a>.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">10. What software/technology is used for the NLP service?</div>
<div class="collapsible-body">
<span>
<p>
The NLP service uses <a href="https://spacy.io/">spaCy</a>.
</p>
<p>
For more details take a look at the
<a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nlp">source code</a>.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">11. What software/technology is used for the Analysis service?</div>
<div class="collapsible-body">
<span>
<p>
The Corpus Analysis service uses the <a href="http://cwb.sourceforge.net/">
IMS Open Corpus Workbench (CWB).</a> We developed a Python
library for the IMS Open Corpus Workbench (CWB) corpus query
interface (CQi) API to be able to request query results from the CWB
server using simple Python code. The library is
<a href="https://pypi.org/project/cqi/">avilable on PyPi.</a>
</p>
<p>
For more details take a look at the
<a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/cqpweb">source code</a>.
</p>
</span>
</div>
<li>
<div class="collapsible-header">12. Can I download/export my results and processed files?</div>
<div class="collapsible-body">
<span>
<p>
Yes. You can download everything that is the result of a service
and save it somwhere else. You can download your results depending
on the service in easily reusable formats like TXT, PDF, JSON, XML
and many more. This also empowers you to use your results in other
third party software to continue you research beyond the capabiltiys
of nopaque.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">13. Is my research data private?</div>
<div class="collapsible-body">
<span>
<p>
Your uploaded research data cannot be accessed by any third party.
Take a look at our <a href="http://nopaque.localhost/privacy_policy">GDPR</a>
statement and <a href="http://nopaque.localhost/terms_of_use">terms of use</a>
if you want to learn more about how we handle your data.
<p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">14. Could I use nopaque as a permant storage for my research data?</div>
<div class="collapsible-body">
<span>
<p>
nopaque saves your research data in theory as long as your account
exists. But nopaque is not a cloud storage solution! We encourage
you to permanently save your data somwhere else.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">15. What does OCR mean?</div>
<div class="collapsible-body">
<span>
<p>
OCR stands for Optical Character Recognition. OCR is the automatical
conversion of images of handwritten or printed text into machine-encoded text.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">16. What does NLP mean?</div>
<div class="collapsible-body">
<span>
<p>
NLP stands for natural language processing wich is a subfield of
linguistics, computer science and artificial intelligence concerned
with the interactions between computers and human language.
For example nopaque uses spaCy to automtically tag every word with
its part of speech tag which describes its grammatical property.
</p>
</span>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="col s12">
<ul class="collapsible">
<li>
<div class="collapsible-header">1. Who is developing nopaque?</div>
<div class="collapsible-body">
<span>
<p>
<em>nopaque</em> is developed by a small, interdisciplinary Team at
<em>University Bielefeld</em> called <em>Data Infrastructure and
Digital Humanities (INF)</em>. We are part of the <em>SFB 1288 -
Practices of comparing. Ordering and changing the world</em>.
</p>
<p>For mor information <a href="https://www.uni-bielefeld.de/(en)/sfb1288/">
visit the SFB1288 web site</a> or
<a href="https://www.uni-bielefeld.de/(en)/sfb1288/projekte/inf.html">
our team page</a>.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">2. Is nopaque free to use for everyone?</div>
<div class="collapsible-body">
<span>
<p>
Yes nopaque is free to use for everyone! It does not matter if you
are a researcher in the humanities, a student or just someone who
wants to learn something new. Just <a href="http://nopaque.localhost/auth/register">
sign up for it</a> and try it out!
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">3. How much does it cost to use nopaque?</div>
<div class="collapsible-body">
<span>nopaque and the services provided by it are free of charge.</span>
</div>
<li>
<li>
<div class="collapsible-header">4. Why is nopaque written in lower case?</div>
<div class="collapsible-body">
<span>We just think that nopaque with a lower case first letter looks
better than Nopaque with an upper case first letter. Simple as that!
</span>
</div>
<li>
<li>
<div class="collapsible-header">5. Why the name nopaque?</div>
<div class="collapsible-body">
<span>
<p>
When we started developing nopaque we wanted to have a cool name
like <a href="https://voyant-tools.org/">voyant</a> which can be translated
to light or seeing. So we choose opaque thinking that it means that
something is transparent. After a while we realized that we misunderstood
the meaning of the word (opaque means non-transparent) and simply
negated it ending up with nopaque.
</p>
<p>
We also think nopaque fits pretty nicley because we want you to be
able to make your texts transparent and see through them with our
analysis tool to gain knew knowledge about them.
</p>
</span>
</div>
<li>
<div class="collapsible-header">6. Is nopaque FOSS/Open Source?</div>
<div class="collapsible-body">
<span>Yes nopaque only uses free and open source software (FOSS). You
can find the <a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/opaque">
source code in our gitlab repository</a>.
</span>
</div>
</li>
<li>
<div class="collapsible-header">7. What software/technologies is nopaque using/build with?</div>
<div class="collapsible-body">
<span>
<p>
nopaques frontend (what the user sees) is written in HTML 5
and Javascript. The backend (stuff that happens on our servers)
is realized with <a href="https://palletsprojects.com/p/flask/">
Flask</a>, a python based lightweight WSGI web application
framework. We utilize <a href="https://www.docker.com/">Docker</a>
to easily deploy nopaque on our servers.
</p>
<p>
The client server real time comminication is implemented using
<a href="https://flask-socketio.readthedocs.io/en/latest/">Flask-SocketIO</a>.
</p>
<p>Every service (e.g. OCR or NLP) provided by nopaque is using
established opensource software. Take a look at their related
questions to learn more about them.</p>
<p>
For more details take a look at the
<a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/opaque">source code</a>.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">8. What software/technology is used for the File Setup service?</div>
<div class="collapsible-body">
<span>
<p>
The File Setup service uses <a href="https://imagemagick.org/index.php">ImageMagick</a>
to merge your images into one file.
</p>
<p>
For more details take a look at the
<a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/file-setup">source code</a>.
</p>
</span>
<li>
<div class="collapsible-header">9. What software/technology is used for the OCR service?</div>
<div class="collapsible-body">
<span>
<p>
The OCR service uses <a href="https://github.com/tesseract-ocr/tesseract">Tesseract OCR.</a>
</p>
<p>
For more details take a look at the
<a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/ocr">source code</a>.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">10. What software/technology is used for the NLP service?</div>
<div class="collapsible-body">
<span>
<p>
The NLP service uses <a href="https://spacy.io/">spaCy</a>.
</p>
<p>
For more details take a look at the
<a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nlp">source code</a>.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">11. What software/technology is used for the Analysis service?</div>
<div class="collapsible-body">
<span>
<p>
The Corpus Analysis service uses the <a href="http://cwb.sourceforge.net/">
IMS Open Corpus Workbench (CWB).</a> We developed a Python
library for the IMS Open Corpus Workbench (CWB) corpus query
interface (CQi) API to be able to request query results from the CWB
server using simple Python code. The library is
<a href="https://pypi.org/project/cqi/">avilable on PyPi.</a>
</p>
<p>
For more details take a look at the
<a href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/cqpweb">source code</a>.
</p>
</span>
</div>
<li>
<div class="collapsible-header">12. Can I download/export my results and processed files?</div>
<div class="collapsible-body">
<span>
<p>
Yes. You can download everything that is the result of a service
and save it somwhere else. You can download your results depending
on the service in easily reusable formats like TXT, PDF, JSON, XML
and many more. This also empowers you to use your results in other
third party software to continue you research beyond the capabiltiys
of nopaque.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">13. Is my research data private?</div>
<div class="collapsible-body">
<span>
<p>
Your uploaded research data cannot be accessed by any third party.
Take a look at our <a href="http://nopaque.localhost/privacy_policy">GDPR</a>
statement and <a href="http://nopaque.localhost/terms_of_use">terms of use</a>
if you want to learn more about how we handle your data.
<p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">14. Could I use nopaque as a permant storage for my research data?</div>
<div class="collapsible-body">
<span>
<p>
nopaque saves your research data in theory as long as your account
exists. But nopaque is not a cloud storage solution! We encourage
you to permanently save your data somwhere else.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">15. What does OCR mean?</div>
<div class="collapsible-body">
<span>
<p>
OCR stands for Optical Character Recognition. OCR is the automatical
conversion of images of handwritten or printed text into machine-encoded text.
</p>
</span>
</div>
</li>
<li>
<div class="collapsible-header">16. What does NLP mean?</div>
<div class="collapsible-body">
<span>
<p>
NLP stands for natural language processing wich is a subfield of
linguistics, computer science and artificial intelligence concerned
with the interactions between computers and human language.
For example nopaque uses spaCy to automtically tag every word with
its part of speech tag which describes its grammatical property.
</p>
</span>
</div>
</li>
</ul>
</div>
{% endblock %}

View File

@ -1,29 +1,109 @@
{% extends "nopaque.html.j2" %}
{% block page_content %}
<div class="col s12">
<h3>My Corpora and Query results</h3>
<p>Create a corpus to interactively perform linguistic analysis or import query results to save interesting passages.</p>
<div class="container">
<div class="row">
<div class="col s12">
<ul class="tabs">
<li class="tab col s6"><a class="active" href="#corpora">Corpora</a></li>
<li class="tab col s6"><a href="#query-results">Query results</a></li>
</ul>
<h1>{{ title }}</h1>
</div>
<div class="col s12" id="corpora">
<div class="col s12">
<h3>My Corpora and Query results</h3>
<p>Create a corpus to interactively perform linguistic analysis or import query results to save interesting passages.</p>
<div class="row">
<div class="col s12">
<ul class="tabs">
<li class="tab col s6"><a class="active" href="#corpora">Corpora</a></li>
<li class="tab col s6"><a href="#query-results">Query results</a></li>
</ul>
</div>
<div class="col s12" id="corpora">
<div class="card">
<div class="card-content">
<div class="input-field">
<i class="material-icons prefix">search</i>
<input id="search-corpus" class="search" type="search"></input>
<label for="search-corpus">Search corpus</label>
</div>
<ul class="pagination paginationTop"></ul>
<table class="highlight">
<thead>
<tr>
<th></th>
<th>
<span class="sort" data-sort="title">Title</span>
<span class="sort" data-sort="description">Description</span>
</th>
<th><span class="sort" data-sort="status">Status</span></th>
<th></th>
</tr>
</thead>
<tbody class="list"></tbody>
</table>
<ul class="pagination paginationBottom"></ul>
</div>
<div class="card-action right-align">
<a class="waves-effect waves-light btn" href="{{ url_for('corpora.add_corpus') }}">New corpus<i class="material-icons right">add</i></a>
</div>
</div>
</div>
<div class="col s12" id="query-results">
<div class="card">
<div class="card-content">
<div class="input-field">
<i class="material-icons prefix">search</i>
<input id="search-query-results" class="search" type="search"></input>
<label for="search-query-results">Search query result</label>
</div>
<ul class="pagination paginationTop"></ul>
<table class="highlight responsive-table">
<thead>
<tr>
<th>
<span class="sort" data-sort="title">Title</span> and<br>
<span class="sort" data-sort="description">Description</span>
</th>
<th>
<span class="sort" data-sort="corpus">Corpus</span> and<br>
<span class="sort" data-sort="query">Query</span>
</th>
<th>{# Actions #}</th>
</tr>
</thead>
<tbody class="list">
<tr class="show-if-only-child">
<td colspan="5">
<span class="card-title"><i class="material-icons left">folder</i>Nothing here...</span>
<p>No query results yet imported.</p>
</td>
</tr>
</tbody>
</table>
<ul class="pagination paginationBottom"></ul>
</div>
<div class="card-action right-align">
<a class="waves-effect waves-light btn" href="{{ url_for('corpora.add_query_result') }}">Add query result<i class="material-icons right">file_upload</i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col s12" id="jobs">
<h3>My Jobs</h3>
<p>A job is the execution of a service provided by nopaque. You can create any number of jobs and let them be processed simultaneously.</p>
<div class="card">
<div class="card-content">
<div class="input-field">
<i class="material-icons prefix">search</i>
<input id="search-corpus" class="search" type="search"></input>
<label for="search-corpus">Search corpus</label>
<input id="search-job" class="search" type="search"></input>
<label for="search-job">Search job</label>
</div>
<ul class="pagination paginationTop"></ul>
<table class="highlight">
<thead>
<tr>
<th></th>
<th><span class="sort" data-sort="service">Service</span></th>
<th>
<span class="sort" data-sort="title">Title</span>
<span class="sort" data-sort="description">Description</span>
@ -37,135 +117,66 @@
<ul class="pagination paginationBottom"></ul>
</div>
<div class="card-action right-align">
<a class="waves-effect waves-light btn" href="{{ url_for('corpora.add_corpus') }}">New corpus<i class="material-icons right">add</i></a>
<p><a class="modal-trigger waves-effect waves-light btn" href="#" data-target="new-job-modal"><i class="material-icons left">add</i>New job</a></p>
</div>
</div>
</div>
<div class="col s12" id="query-results">
<div class="card">
<div class="card-content">
<div class="input-field">
<i class="material-icons prefix">search</i>
<input id="search-query-results" class="search" type="search"></input>
<label for="search-query-results">Search query result</label>
<div id="new-job-modal" class="modal">
<div class="modal-content">
<h4>Select a service</h4>
<div class="row">
<div class="col s12 m4">
<div class="card-panel center-align hoverable">
<br>
<a href="{{ url_for('services.service', service='file-setup') }}" class="btn-floating btn-large file-setup-color darken waves-effect waves-light" style="transform: scale(2);">
<i class="material-icons service" data-service="file-setup"></i>
</a>
<p>&nbsp;</p>
<p class="file-setup-color-text"><b>File setup</b></p>
<p class="light">Digital copies of text based research data (books, letters, etc.) often comprise various files and formats. nopaque converts and merges those files to facilitate further processing and the application of other services.</p>
<a href="{{ url_for('services.service', service='file-setup') }}" class="waves-effect waves-light btn file-setup-color darken">Create Job</a>
</div>
</div>
<div class="col s12 m4">
<div class="card-panel center-align hoverable">
<br>
<a href="{{ url_for('services.service', service='ocr') }}" class="btn-floating btn-large ocr-color darken waves-effect waves-light" style="transform: scale(2);">
<i class="material-icons service" data-service="ocr"></i>
</a>
<p>&nbsp;</p>
<p class="ocr-color-text"><b>Optical Character Recognition</b></p>
<p class="light">nopaque converts your image data like photos or scans into text data through a process called OCR. This step enables you to proceed with further computational analysis of your documents.</p>
<a href="{{ url_for('services.service', service='ocr') }}" class="waves-effect waves-light btn ocr-color darken">Create Job</a>
</div>
</div>
<div class="col s12 m4">
<div class="card-panel center-align hoverable">
<br>
<a href="{{ url_for('services.service', service='nlp') }}" class="btn-floating btn-large nlp-color darken waves-effect waves-light" style="transform: scale(2);">
<i class="material-icons service" data-service="nlp"></i>
</a>
<p>&nbsp;</p>
<p class="nlp-color-text"><b>Natural Language Processing</b></p>
<p class="light">By means of computational linguistic data processing (tokenization, lemmatization, part-of-speech tagging and named-entity recognition) nopaque extracts additional information from your text.</p>
<a href="{{ url_for('services.service', service='nlp') }}" class="waves-effect waves-light btn nlp-color darken">Create Job</a>
</div>
</div>
</div>
<ul class="pagination paginationTop"></ul>
<table class="highlight responsive-table">
<thead>
<tr>
<th>
<span class="sort" data-sort="title">Title</span> and<br>
<span class="sort" data-sort="description">Description</span>
</th>
<th>
<span class="sort" data-sort="corpus">Corpus</span> and<br>
<span class="sort" data-sort="query">Query</span>
</th>
<th>{# Actions #}</th>
</tr>
</thead>
<tbody class="list">
<tr class="show-if-only-child">
<td colspan="5">
<span class="card-title"><i class="material-icons left">folder</i>Nothing here...</span>
<p>No query results yet imported.</p>
</td>
</tr>
</tbody>
</table>
<ul class="pagination paginationBottom"></ul>
</div>
<div class="card-action right-align">
<a class="waves-effect waves-light btn" href="{{ url_for('corpora.add_query_result') }}">Add query result<i class="material-icons right">file_upload</i></a>
<div class="modal-footer">
<a href="#!" class="modal-close waves-effect waves-light btn-flat">Close</a>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
<div class="col s12" id="jobs">
<h3>My Jobs</h3>
<p>A job is the execution of a service provided by nopaque. You can create any number of jobs and let them be processed simultaneously.</p>
<div class="card">
<div class="card-content">
<div class="input-field">
<i class="material-icons prefix">search</i>
<input id="search-job" class="search" type="search"></input>
<label for="search-job">Search job</label>
</div>
<ul class="pagination paginationTop"></ul>
<table class="highlight">
<thead>
<tr>
<th><span class="sort" data-sort="service">Service</span></th>
<th>
<span class="sort" data-sort="title">Title</span>
<span class="sort" data-sort="description">Description</span>
</th>
<th><span class="sort" data-sort="status">Status</span></th>
<th></th>
</tr>
</thead>
<tbody class="list"></tbody>
</table>
<ul class="pagination paginationBottom"></ul>
</div>
<div class="card-action right-align">
<p><a class="modal-trigger waves-effect waves-light btn" href="#" data-target="new-job-modal"><i class="material-icons left">add</i>New job</a></p>
</div>
</div>
<div id="new-job-modal" class="modal">
<div class="modal-content">
<h4>Select a service</h4>
<div class="row">
<div class="col s12 m4">
<div class="card-panel center-align hoverable">
<br>
<a href="{{ url_for('services.service', service='file-setup') }}" class="btn-floating btn-large file-setup-color darken waves-effect waves-light" style="transform: scale(2);">
<i class="material-icons service" data-service="file-setup"></i>
</a>
<p>&nbsp;</p>
<p class="file-setup-color-text"><b>File setup</b></p>
<p class="light">Digital copies of text based research data (books, letters, etc.) often comprise various files and formats. nopaque converts and merges those files to facilitate further processing and the application of other services.</p>
<a href="{{ url_for('services.service', service='file-setup') }}" class="waves-effect waves-light btn file-setup-color darken">Create Job</a>
</div>
</div>
<div class="col s12 m4">
<div class="card-panel center-align hoverable">
<br>
<a href="{{ url_for('services.service', service='ocr') }}" class="btn-floating btn-large ocr-color darken waves-effect waves-light" style="transform: scale(2);">
<i class="material-icons service" data-service="ocr"></i>
</a>
<p>&nbsp;</p>
<p class="ocr-color-text"><b>Optical Character Recognition</b></p>
<p class="light">nopaque converts your image data like photos or scans into text data through a process called OCR. This step enables you to proceed with further computational analysis of your documents.</p>
<a href="{{ url_for('services.service', service='ocr') }}" class="waves-effect waves-light btn ocr-color darken">Create Job</a>
</div>
</div>
<div class="col s12 m4">
<div class="card-panel center-align hoverable">
<br>
<a href="{{ url_for('services.service', service='nlp') }}" class="btn-floating btn-large nlp-color darken waves-effect waves-light" style="transform: scale(2);">
<i class="material-icons service" data-service="nlp"></i>
</a>
<p>&nbsp;</p>
<p class="nlp-color-text"><b>Natural Language Processing</b></p>
<p class="light">By means of computational linguistic data processing (tokenization, lemmatization, part-of-speech tagging and named-entity recognition) nopaque extracts additional information from your text.</p>
<a href="{{ url_for('services.service', service='nlp') }}" class="waves-effect waves-light btn nlp-color darken">Create Job</a>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<a href="#!" class="modal-close waves-effect waves-light btn-flat">Close</a>
</div>
</div>
</div>
{% block scripts %}
{{ super() }}
<script type="module">
import {RessourceList} from '../../static/js/nopaque.lists.js';
let corpusList = new RessourceList("corpora", nopaque.corporaSubscribers, "Corpus");
let jobList = new RessourceList("jobs", nopaque.jobsSubscribers, "Job");
let queryResultList = new RessourceList("query-results", nopaque.queryResultsSubscribers, "QueryResult");
</script>
{% endblock %}
{% endblock scripts %}

View File

@ -1,6 +1,5 @@
{% extends "nopaque.html.j2" %}
{% set parallax = True %}
{% import 'materialize/wtf.html.j2' as wtf %}
{% block page_content %}
<div class="section white">
@ -157,19 +156,19 @@
<div class="card-content">
<span class="card-title">Log in</span>
{{ login_form.hidden_tag() }}
{{ M.render_field(login_form.user, material_icon='person') }}
{{ M.render_field(login_form.password, material_icon='vpn_key') }}
{{ wtf.render_field(login_form.user, material_icon='person') }}
{{ wtf.render_field(login_form.password, material_icon='vpn_key') }}
<div class="row" style="margin-bottom: 0;">
<div class="col s6 left-align">
<a href="{{ url_for('auth.reset_password_request') }}">Forgot your password?</a>
</div>
<div class="col s6 right-align">
{{ M.render_field(login_form.remember_me) }}
{{ wtf.render_field(login_form.remember_me) }}
</div>
</div>
</div>
<div class="card-action right-align">
{{ M.render_field(login_form.submit, material_icon='send') }}
{{ wtf.render_field(login_form.submit, material_icon='send') }}
</div>
</form>
</div>

View File

@ -1,14 +1,21 @@
{% extends "nopaque.html.j2" %}
{% block page_content %}
<div class="col s12">
<div class="card" id="beta-launch">
<div class="card-content">
<span class="card-title">nopaque's beta launch</span>
<p>Dear users</p>
<br>
<p>A few days ago we went live with nopaque. Right now nopaque is still in its Beta phase. So some bugs are to be expected. If you encounter any bugs or some feature is not working as expected please send as an email using the feedback button at the botton of the page in the footer!</p>
<p>We are happy to help you with any issues and will use the feedback to fix all mentioned bugs!</p>
<div class="container">
<div class="row">
<div class="col s12">
<h1>{{ title }}</h1>
</div>
<div class="col s12">
<div class="card" id="beta-launch">
<div class="card-content">
<span class="card-title">nopaque's beta launch</span>
<p>Dear users</p>
<br>
<p>A few days ago we went live with nopaque. Right now nopaque is still in its Beta phase. So some bugs are to be expected. If you encounter any bugs or some feature is not working as expected please send as an email using the feedback button at the botton of the page in the footer!</p>
<p>We are happy to help you with any issues and will use the feedback to fix all mentioned bugs!</p>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,147 +1,154 @@
{% extends "nopaque.html.j2" %}
{% block page_content %}
<div class="col s12">
<p>With these data protection notices, Bielefeld University fulfils its obligation to provide information in accordance with Articles 13 & 14 of the EU General Data Protection Regulation (GDPR) on the above-mentioned processing of personal data. Terms such as "personal data", "processing", "data controller", "third party", etc. are used as defined in Article 4 GDPR.</p>
</div>
<div class="container">
<div class="row">
<div class="col s12">
<h1>{{ title }}</h1>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 1 Contact Details</span>
<p>Bielefeld University, a legal entity under public law established by the state of North Rhine-Westphalia (NRW), is responsible for processing the data. It is represented by its rector, Prof. Dr. Ing. Gerhard Sagerer.</p>
<h6>§ 1.1. Contact details of the data controller</h6>
<ul class="browser-default">
<li>Data protection officer of the Faculty of History</li>
<li>Prof. Dr. Stefan Gorißen</li>
<li>Universitätsstraße 25</li>
<li>D-33615 Bielefeld</li>
<li>Phone: +49 521 / 106-3152</li>
<li>Email:
<a href="mailto:stefan.gorissen@uni-bielefeld.de">stefan.gorissen@uni-bielefeld.de</a>
</li>
<li>Web:
<a href="https://www.uni-bielefeld.de">https://www.uni-bielefeld.de</a>
</li>
</ul>
<h6>§ 1.2. Technical contact person</h6>
<ul class="browser-default">
<li>Dr. Johanna Vompras</li>
<li>Email:
<a href="mailto:johanna.vompras@uni-bielefeld.de">johanna.vompras@uni-bielefeld.de</a>
</li>
<li>Web.:
<a href="https://www.uni-bielefeld.de/(en)/sfb1288/projekte/inf.html">https://www.uni-bielefeld.de/(en)/sfb1288/projekte/inf.html</a>
</li>
</ul>
<h6>§ 1.2. Contact details of the data protection officer</h6>
<ul class="browser-default">
<li>The data protection officer responsible is:</li>
<li>Phone: +49 521 106-5225</li>
<li>
Email: <a href="mailto:datenschutzbeauftragte@uni-bielefeld.de">datenschutzbeauftragte@uni-bielefeld.de</a>
</li>
</ul>
<div class="col s12">
<p>With these data protection notices, Bielefeld University fulfils its obligation to provide information in accordance with Articles 13 & 14 of the EU General Data Protection Regulation (GDPR) on the above-mentioned processing of personal data. Terms such as "personal data", "processing", "data controller", "third party", etc. are used as defined in Article 4 GDPR.</p>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 1 Contact Details</span>
<p>Bielefeld University, a legal entity under public law established by the state of North Rhine-Westphalia (NRW), is responsible for processing the data. It is represented by its rector, Prof. Dr. Ing. Gerhard Sagerer.</p>
<h6>§ 1.1. Contact details of the data controller</h6>
<ul class="browser-default">
<li>Data protection officer of the Faculty of History</li>
<li>Prof. Dr. Stefan Gorißen</li>
<li>Universitätsstraße 25</li>
<li>D-33615 Bielefeld</li>
<li>Phone: +49 521 / 106-3152</li>
<li>Email:
<a href="mailto:stefan.gorissen@uni-bielefeld.de">stefan.gorissen@uni-bielefeld.de</a>
</li>
<li>Web:
<a href="https://www.uni-bielefeld.de">https://www.uni-bielefeld.de</a>
</li>
</ul>
<h6>§ 1.2. Technical contact person</h6>
<ul class="browser-default">
<li>Dr. Johanna Vompras</li>
<li>Email:
<a href="mailto:johanna.vompras@uni-bielefeld.de">johanna.vompras@uni-bielefeld.de</a>
</li>
<li>Web.:
<a href="https://www.uni-bielefeld.de/(en)/sfb1288/projekte/inf.html">https://www.uni-bielefeld.de/(en)/sfb1288/projekte/inf.html</a>
</li>
</ul>
<h6>§ 1.2. Contact details of the data protection officer</h6>
<ul class="browser-default">
<li>The data protection officer responsible is:</li>
<li>Phone: +49 521 106-5225</li>
<li>
Email: <a href="mailto:datenschutzbeauftragte@uni-bielefeld.de">datenschutzbeauftragte@uni-bielefeld.de</a>
</li>
</ul>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 2 General information on data processing and its purpose</span>
<p>We process the personal data of our users only to the extent necessary to provide a functioning website and its functionalities.</p>
<p>The following personal data is collected and stored within the system:</p>
<h6>Master Data</h6>
<p>Within the scope of user authentication the following personal data is collected and processed:</p>
<ul class="browser-default">
<li>User name</li>
<li>E-Mail</li>
</ul>
<p>Registration of the user is required for the provision of certain content and services within nopaque.</p>
<h6>Protocol Data</h6>
<p>In general, when a website is visited, for technical reasons information is automatically sent from the browser to the server and stored there in access protocols. When using a web application, additional protocol data is also generated, which is necessary for tracking technical errors. This information includes:</p>
<ul class="browser-default">
<li>IP address</li>
<li>User account</li>
<li>Complete HTTP request URL</li>
<li>HTTP action (e.g. GET: call up a page, POST: send form data)</li>
<li>Access status (HTTP status code)</li>
<li>data volume retrieved</li>
<li>Date and time of the action</li>
<li>User-Agent string</li>
</ul>
<p>Locally logged data will be used by the development team in order to debug and improve tools. This data can only be viewed by the technical administration and by the employees responsible for the nopaque platform. Data is stored for seven days to ensure proper technical operation and to find the cause of errors and is deleted <u>afterwards</u>.</p>
<p>Logged data may be used to understand how researchers are using the nopaque platform. To be able to use the data for research purposes, we reserve the right to store it in an anonymous and aggregated form for a longer period of time (up to two years after completion of the SFB 1288 INF project).</p>
<h6>Cookies</h6>
<p>Browsers store so-called cookies. Cookies are files that can be stored by the provider of a website in the directory of the browser program on the user's computer. These files contain text information and can be read again by the provider when the page is called up again. The provider can use these cookies, for example, to always deliver pages in the theme selected by the user.</p>
<p>The storage of cookies can be switched off in the browser settings or provided with an expiry time. By deactivating cookies, however, some functions that are controlled by cookies can then only be used to a limited extent or not at all.</p>
<p>NOPAQUE uses cookies for the following purposes:</p>
<ul class="browser-default">
<li>Recognition of a user during a session in order to assign personal content and other user-defined settings.</li>
<li>Login Script with Remember Me feature allows the user to preserve their logged in status. When the user checks the Remember Me option, then the logged in status is serialized in the session and stored in cookies in an encrypted way.</li>
</ul>
<h6>Content Data</h6>
<p>The content data includes all data that is entered or created by users themselves in the system. This data is listed here because it is assigned to individual authors and may contain personal data. This may include: uploaded files, images, texts or other media files. Please note that files and scans submitted to NOPAQUE are stored in order to allow persistent access during a work session and between work sessions.</p>
<p>According to § 4 paragraph 2 of the General Terms of Use for the use of NOPAQUE at Bielefeld University, the users themselves are responsible for the content they post and must comply with the legal provisions of data protection. This includes in particular the deletion of personal data that may no longer be processed.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 3 Legal basis of the data processing</span>
<p>The legal basis for the processing of personal data for user authentication is <b>Article 6 (1) letter e GDPR</b>. The processing is carried out within the framework of the fulfilment of the tasks of Bielefeld University in accordance with HG NRW (NRW Higher Education Act), if necessary in connection with an order of the university to be named or by a special law, e.g. University Statistics Act, State Civil Servants Act, Staff Representation Act, Equal Opportunities Act.</p>
<p>The collection of personal data for user authentication is based on the consent of the data subjects as stated in <b>Article 6 (1) letter a GDPR</b>. The legal basis for the transmission of personal data is <b>Article 6 (1) letter c GDPR</b>.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 4 Data transmissions</span>
<p>Your personal data, which are processed by Bielefeld University for the purposes mentioned under 2. will not be transferred to third parties.</p>
<p>In individual cases, data may also be legally transmitted to third parties, for example, to law enforcement authorities for the investigation of criminal offences within the framework of the <b>Code of Criminal Procedure (StPO)</b>. If technical service providers are given access to personal data, this is done on the basis of a contract in accordance with <b>Article 28 GDPR</b>.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 5 Duration of processing / data deletion</span>
<p>Data processed for user authentication are deleted immediately after account deletion.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 6 Your rights as a data subject</span>
<p>As a data subject, you have certain rights under <b>GDPR</b> that you may assert at any time:</p>
<ul class="browser-default">
<li>the right to access information about whether or not personal data concerning you is processed, and if so, what categories of data are being processed (<b>Article 15 GDPR</b>),</li>
<li>the right to demand the rectification or completion of data concerning you (<b>Article 16 GDPR</b>),</li>
<li>the right to erasure of your personal data in accordance with <b>Article 17 GDPR</b>,</li>
<li>the right to demand the restriction of the processing of your data per <b>Article 18 GDPR</b>,</li>
<li>the right to withdraw your consent at any time. The withdrawal of consent does not affect the lawfulness of the processing based on consent before its withdrawal (<b>Article 7 (3) GDPR</b>),</li>
<li>the right to object to the future processing of your data in accordance of <b>Article 21 GDPR</b>,</li>
<li>the right to receive personal data concerning you and your account in a structured, common and machine-readable format in accordance of <b>Article 20 GDPR</b>.</li>
</ul>
<p>In addition to the aforementioned rights, you have the right to lodge a complaint with the data protection supervisory authority (<b>Article 77 GDPR</b>); for example, the university is under the supervision of the</p>
<ul>
<li>North Rhine-Westphalia State Commissioner</li>
<li>for Data Protection and Freedom of Information</li>
<li>(Landesbeauftragte für Datenschutz und</li>
<li>Informationsfreiheit Nordrhein-Westfalen)</li>
<li>Kavalleriestraße 2-4</li>
<li>40213 Düsseldorf, German</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 2 General information on data processing and its purpose</span>
<p>We process the personal data of our users only to the extent necessary to provide a functioning website and its functionalities.</p>
<p>The following personal data is collected and stored within the system:</p>
<h6>Master Data</h6>
<p>Within the scope of user authentication the following personal data is collected and processed:</p>
<ul class="browser-default">
<li>User name</li>
<li>E-Mail</li>
</ul>
<p>Registration of the user is required for the provision of certain content and services within nopaque.</p>
<h6>Protocol Data</h6>
<p>In general, when a website is visited, for technical reasons information is automatically sent from the browser to the server and stored there in access protocols. When using a web application, additional protocol data is also generated, which is necessary for tracking technical errors. This information includes:</p>
<ul class="browser-default">
<li>IP address</li>
<li>User account</li>
<li>Complete HTTP request URL</li>
<li>HTTP action (e.g. GET: call up a page, POST: send form data)</li>
<li>Access status (HTTP status code)</li>
<li>data volume retrieved</li>
<li>Date and time of the action</li>
<li>User-Agent string</li>
</ul>
<p>Locally logged data will be used by the development team in order to debug and improve tools. This data can only be viewed by the technical administration and by the employees responsible for the nopaque platform. Data is stored for seven days to ensure proper technical operation and to find the cause of errors and is deleted <u>afterwards</u>.</p>
<p>Logged data may be used to understand how researchers are using the nopaque platform. To be able to use the data for research purposes, we reserve the right to store it in an anonymous and aggregated form for a longer period of time (up to two years after completion of the SFB 1288 INF project).</p>
<h6>Cookies</h6>
<p>Browsers store so-called cookies. Cookies are files that can be stored by the provider of a website in the directory of the browser program on the user's computer. These files contain text information and can be read again by the provider when the page is called up again. The provider can use these cookies, for example, to always deliver pages in the theme selected by the user.</p>
<p>The storage of cookies can be switched off in the browser settings or provided with an expiry time. By deactivating cookies, however, some functions that are controlled by cookies can then only be used to a limited extent or not at all.</p>
<p>NOPAQUE uses cookies for the following purposes:</p>
<ul class="browser-default">
<li>Recognition of a user during a session in order to assign personal content and other user-defined settings.</li>
<li>Login Script with Remember Me feature allows the user to preserve their logged in status. When the user checks the Remember Me option, then the logged in status is serialized in the session and stored in cookies in an encrypted way.</li>
</ul>
<h6>Content Data</h6>
<p>The content data includes all data that is entered or created by users themselves in the system. This data is listed here because it is assigned to individual authors and may contain personal data. This may include: uploaded files, images, texts or other media files. Please note that files and scans submitted to NOPAQUE are stored in order to allow persistent access during a work session and between work sessions.</p>
<p>According to § 4 paragraph 2 of the General Terms of Use for the use of NOPAQUE at Bielefeld University, the users themselves are responsible for the content they post and must comply with the legal provisions of data protection. This includes in particular the deletion of personal data that may no longer be processed.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 3 Legal basis of the data processing</span>
<p>The legal basis for the processing of personal data for user authentication is <b>Article 6 (1) letter e GDPR</b>. The processing is carried out within the framework of the fulfilment of the tasks of Bielefeld University in accordance with HG NRW (NRW Higher Education Act), if necessary in connection with an order of the university to be named or by a special law, e.g. University Statistics Act, State Civil Servants Act, Staff Representation Act, Equal Opportunities Act.</p>
<p>The collection of personal data for user authentication is based on the consent of the data subjects as stated in <b>Article 6 (1) letter a GDPR</b>. The legal basis for the transmission of personal data is <b>Article 6 (1) letter c GDPR</b>.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 4 Data transmissions</span>
<p>Your personal data, which are processed by Bielefeld University for the purposes mentioned under 2. will not be transferred to third parties.</p>
<p>In individual cases, data may also be legally transmitted to third parties, for example, to law enforcement authorities for the investigation of criminal offences within the framework of the <b>Code of Criminal Procedure (StPO)</b>. If technical service providers are given access to personal data, this is done on the basis of a contract in accordance with <b>Article 28 GDPR</b>.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 5 Duration of processing / data deletion</span>
<p>Data processed for user authentication are deleted immediately after account deletion.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 6 Your rights as a data subject</span>
<p>As a data subject, you have certain rights under <b>GDPR</b> that you may assert at any time:</p>
<ul class="browser-default">
<li>the right to access information about whether or not personal data concerning you is processed, and if so, what categories of data are being processed (<b>Article 15 GDPR</b>),</li>
<li>the right to demand the rectification or completion of data concerning you (<b>Article 16 GDPR</b>),</li>
<li>the right to erasure of your personal data in accordance with <b>Article 17 GDPR</b>,</li>
<li>the right to demand the restriction of the processing of your data per <b>Article 18 GDPR</b>,</li>
<li>the right to withdraw your consent at any time. The withdrawal of consent does not affect the lawfulness of the processing based on consent before its withdrawal (<b>Article 7 (3) GDPR</b>),</li>
<li>the right to object to the future processing of your data in accordance of <b>Article 21 GDPR</b>,</li>
<li>the right to receive personal data concerning you and your account in a structured, common and machine-readable format in accordance of <b>Article 20 GDPR</b>.</li>
</ul>
<p>In addition to the aforementioned rights, you have the right to lodge a complaint with the data protection supervisory authority (<b>Article 77 GDPR</b>); for example, the university is under the supervision of the</p>
<ul>
<li>North Rhine-Westphalia State Commissioner</li>
<li>for Data Protection and Freedom of Information</li>
<li>(Landesbeauftragte für Datenschutz und</li>
<li>Informationsfreiheit Nordrhein-Westfalen)</li>
<li>Kavalleriestraße 2-4</li>
<li>40213 Düsseldorf, German</li>
</ul>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,105 +1,111 @@
{% extends "nopaque.html.j2" %}
{% block page_content %}
<div class="container">
<div class="row">
<div class="col s12">
<h1>{{ title }}</h1>
</div>
<div class="col s12">
<p>With the usage of the nopaque platform you declare your acceptance of the General Terms of Use and that you have taken note of the legal framework and the data protection declaration.</p>
</div>
<div class="col s12">
<p>With the usage of the nopaque platform you declare your acceptance of the General Terms of Use and that you have taken note of the legal framework and the data protection declaration.</p>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 1 Scope</span>
<p>The General Terms of Use for the nopaque platform apply to everyone who uses the system as an authorised user in the sense of <b>§ 2</b> (1) of the General Terms of Use. By using the system and with your consent you accept these terms of use.</p>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 1 Scope</span>
<p>The General Terms of Use for the nopaque platform apply to everyone who uses the system as an authorised user in the sense of <b>§ 2</b> (1) of the General Terms of Use. By using the system and with your consent you accept these terms of use.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 2 Right of use</span>
<p>(1) The nopaque platform is available to users exclusively for the purposes of teaching and research. Any other use, especially for business, commercial is not permitted. The following groups shall be entitled to use the nopaque platform:</p>
<ul class="browser-default">
<li>students, teaching staff and employees at Bielefeld University</li>
<li>external researchers from outside the University Bielefeld</li>
</ul>
<p>&nbsp;</p>
<p>(2) The use of the system is free of charge.</p>
<p>&nbsp;</p>
<p>(3) The duration of the right of use ends with the deletion of the user account by the user (see <b>§ 7</b>)</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 3 Purpose of the Services</span>
<p>nopaque custom-built web application which serves as a platform for preprocessing and analysing digital copies of various text based research data (books, letters, etc.) in different files and formats. nopaque converts image data like photos or scans into text data through OCR making it machine readable. This step enables to proceed with further computational analysis of the documents. By means of computational linguistic data processing (tokenization, lemmatization, part-of-speech tagging and named-entity recognition) nopaque extracts additional information from texts.</p>
<p>&nbsp;</p>
<p>(1) Change of service</p>
<p>The provider of the nopaque platform is entitled to change and supplement the scope of functions of nopaque without prior notice. This could result from a thematic and scientific reorientation of the project.</p>
<p>&nbsp;</p>
<p>(2) Support</p>
<p>On nopaque, a contact form is available. As far as possible the SFB 1288 INF staff will try to provide user support.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 4 Obligations of the User</span>
<p>(1) The system is suitable for normal security requirements. Data with a high need for protection (e.g. health data) may not be stored or processed in the nopaque platform.</p>
<p>&nbsp;</p>
<p>(2) Users of nopaque are responsible for their own entered contents. The uploading of illegal content, especially content that violates criminal, personal, data protection or copyright regulations (including § 60a) is not permitted.</p>
<p>&nbsp;</p>
<p>(3) Users undertake to indemnify Bielefeld University from all claims by third parties based on the data they use and to reimburse Bielefeld University for any costs incurred by the latter due to possible infringements of rights. This also includes the costs incurred by Bielefeld University in defending itself against such claims in and out of court.</p>
<p>&nbsp;</p>
<p>(4) Exclusion from use</p>
<p>Bielefeld University is entitled to immediately block access to the service if there are reasonable grounds to suspect that the stored data is unlawful (e.g upload harmful files via file upload) and/or violates the rights of third parties. Other infringements of the provisions of these Terms of Use, in particular the obligations under §6 also entitle Bielefeld University to block the user. Bielefeld University shall immediately notify the user of the block and the reason for the block. The block must be lifted as soon as the suspicion is invalidated.</p>
<p>&nbsp;</p>
<p>(5) Usage of Data</p>
<p>The data stored by the user on the storage space intended for him may be legally protected, the responsibility for the processing of the data from these points of view lies solely with the user. By using nopaque, the user grants Bielefeld the right to process the data with the corresponding tools. At all times during processing in nopaque, data remains in the user's private storage location and will not passed on to third parties.</p>
<p>&nbsp;</p>
<p>(6) Release of Bielefeld University from Third-Party Claims</p>
<p>The user is responsible for the data stored by him/her in nopaque. Furthermore he/she is responsible for entering and maintaining the data and information required to use nopaque.</p>
<p>&nbsp;</p>
<p>The user is obliged to indemnify Bielefeld University against all claims by third parties based on the data stored by him/her and to reimburse Bielefeld University for any costs incurred as a result of possible legal infringements. This also includes the costs incurred by Bielefeld University for extrajudicial and judicial defense against these claims.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 5 Liability of Bielefeld University</span>
<p>Claims for damages against Bielefeld University are excluded irrespective of the legal grounds. Bielefeld University shall not be liable for loss of data and information or other „indirect“ damages, e.g. loss of profit, loss of production, or other indirect damages. Bielefeld University shall not be liable for the loss of data to the extent that the damage is due to the fact that the user has failed to back up the data and thereby ensure that lost data can be restored with justifiable effort.</p>
<p>&nbsp;</p>
<p>nopaque is available in accordance with normal operational care based on the "Best Effort" practice. No liability is assumed for the consequences of failures or errors of the nopaque platform. Bielefeld University does not guarantee that the systems will run error-free and without interruption at all times. Bielefeld University accepts no responsibility for technical quality. Nor is it liable for the content, in particular for the accuracy, completeness, and timeliness of information to which it merely provides access for use.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 6 Data Protection</span>
<p>Information on the handling of personal data during the operation of the service can be found in the separate data protection policy.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 7 Duration and Termination</span>
<p>The user may terminate the use nopaque by deleting his/her account at any time without giving reasons. After deletion of the account, all users data will be automatically deleted and access to the service blocked. This does not affect the user's right to delete data under data protection law.</p>
<p>&nbsp;</p>
<p>Bielefeld University may exclude the user from using the service without notice for an important reason. Important reasons include, in particular, repeated violations of the provisions of these Terms of Use or of applicable laws.</p>
</div>
</div>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 2 Right of use</span>
<p>(1) The nopaque platform is available to users exclusively for the purposes of teaching and research. Any other use, especially for business, commercial is not permitted. The following groups shall be entitled to use the nopaque platform:</p>
<ul class="browser-default">
<li>students, teaching staff and employees at Bielefeld University</li>
<li>external researchers from outside the University Bielefeld</li>
</ul>
<p>&nbsp;</p>
<p>(2) The use of the system is free of charge.</p>
<p>&nbsp;</p>
<p>(3) The duration of the right of use ends with the deletion of the user account by the user (see <b>§ 7</b>)</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 3 Purpose of the Services</span>
<p>nopaque custom-built web application which serves as a platform for preprocessing and analysing digital copies of various text based research data (books, letters, etc.) in different files and formats. nopaque converts image data like photos or scans into text data through OCR making it machine readable. This step enables to proceed with further computational analysis of the documents. By means of computational linguistic data processing (tokenization, lemmatization, part-of-speech tagging and named-entity recognition) nopaque extracts additional information from texts.</p>
<p>&nbsp;</p>
<p>(1) Change of service</p>
<p>The provider of the nopaque platform is entitled to change and supplement the scope of functions of nopaque without prior notice. This could result from a thematic and scientific reorientation of the project.</p>
<p>&nbsp;</p>
<p>(2) Support</p>
<p>On nopaque, a contact form is available. As far as possible the SFB 1288 INF staff will try to provide user support.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 4 Obligations of the User</span>
<p>(1) The system is suitable for normal security requirements. Data with a high need for protection (e.g. health data) may not be stored or processed in the nopaque platform.</p>
<p>&nbsp;</p>
<p>(2) Users of nopaque are responsible for their own entered contents. The uploading of illegal content, especially content that violates criminal, personal, data protection or copyright regulations (including § 60a) is not permitted.</p>
<p>&nbsp;</p>
<p>(3) Users undertake to indemnify Bielefeld University from all claims by third parties based on the data they use and to reimburse Bielefeld University for any costs incurred by the latter due to possible infringements of rights. This also includes the costs incurred by Bielefeld University in defending itself against such claims in and out of court.</p>
<p>&nbsp;</p>
<p>(4) Exclusion from use</p>
<p>Bielefeld University is entitled to immediately block access to the service if there are reasonable grounds to suspect that the stored data is unlawful (e.g upload harmful files via file upload) and/or violates the rights of third parties. Other infringements of the provisions of these Terms of Use, in particular the obligations under §6 also entitle Bielefeld University to block the user. Bielefeld University shall immediately notify the user of the block and the reason for the block. The block must be lifted as soon as the suspicion is invalidated.</p>
<p>&nbsp;</p>
<p>(5) Usage of Data</p>
<p>The data stored by the user on the storage space intended for him may be legally protected, the responsibility for the processing of the data from these points of view lies solely with the user. By using nopaque, the user grants Bielefeld the right to process the data with the corresponding tools. At all times during processing in nopaque, data remains in the user's private storage location and will not passed on to third parties.</p>
<p>&nbsp;</p>
<p>(6) Release of Bielefeld University from Third-Party Claims</p>
<p>The user is responsible for the data stored by him/her in nopaque. Furthermore he/she is responsible for entering and maintaining the data and information required to use nopaque.</p>
<p>&nbsp;</p>
<p>The user is obliged to indemnify Bielefeld University against all claims by third parties based on the data stored by him/her and to reimburse Bielefeld University for any costs incurred as a result of possible legal infringements. This also includes the costs incurred by Bielefeld University for extrajudicial and judicial defense against these claims.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 5 Liability of Bielefeld University</span>
<p>Claims for damages against Bielefeld University are excluded irrespective of the legal grounds. Bielefeld University shall not be liable for loss of data and information or other „indirect“ damages, e.g. loss of profit, loss of production, or other indirect damages. Bielefeld University shall not be liable for the loss of data to the extent that the damage is due to the fact that the user has failed to back up the data and thereby ensure that lost data can be restored with justifiable effort.</p>
<p>&nbsp;</p>
<p>nopaque is available in accordance with normal operational care based on the "Best Effort" practice. No liability is assumed for the consequences of failures or errors of the nopaque platform. Bielefeld University does not guarantee that the systems will run error-free and without interruption at all times. Bielefeld University accepts no responsibility for technical quality. Nor is it liable for the content, in particular for the accuracy, completeness, and timeliness of information to which it merely provides access for use.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 6 Data Protection</span>
<p>Information on the handling of personal data during the operation of the service can be found in the separate data protection policy.</p>
</div>
</div>
</div>
<div class="col s12">
<div class="card">
<div class="card-content">
<span class="card-title">§ 7 Duration and Termination</span>
<p>The user may terminate the use nopaque by deleting his/her account at any time without giving reasons. After deletion of the account, all users data will be automatically deleted and access to the service blocked. This does not affect the user's right to delete data under data protection law.</p>
<p>&nbsp;</p>
<p>Bielefeld University may exclude the user from using the service without notice for an important reason. Important reasons include, in particular, repeated violations of the provisions of these Terms of Use or of applicable laws.</p>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,35 @@
{% block doc %}
<!DOCTYPE html>
<html{% block html_attribs %}{% endblock html_attribs %}>
{% block html %}
<head>
{% block head %}
<title>{% block title %}{{title|default}}{% endblock title %}</title>
{% block metas %}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{% endblock metas %}
{% block styles %}
<link href="{{ url_for('static', filename='css/material_design_icons.min.css') }}" rel="stylesheet">
<link href="{{ url_for('static', filename='css/materialize.min.css') }}" media="screen,projection" rel="stylesheet">
{% endblock styles %}
{% endblock head %}
</head>
<body{% block body_attribs %}{% endblock body_attribs %}>
{% block body %}
{% block navbar %}
{% endblock navbar %}
{% block sidenav %}
{% endblock sidenav %}
{% block content %}
{% endblock content %}
{% block scripts %}
<script src="{{ url_for('static', filename='js/materialize.min.js') }}"></script>
{% endblock scripts %}
{% endblock body %}
</body>
{% endblock html %}
</html>
{% endblock doc %}

View File

@ -0,0 +1,101 @@
{% macro render_field(field) %}
{% if field.type == 'BooleanField' %}
{{ render_boolean_field(field, *args, **kwargs) }}
{% elif field.type == 'DecimalRangeField' %}
{{ render_decimal_range_field(field, *args, **kwargs) }}
{% elif field.type == 'SubmitField' %}
{{ render_submit_field(field, *args, **kwargs) }}
{% elif field.type in ['FileField', 'MultipleFileField'] %}
{{ render_file_field(field, *args, **kwargs) }}
{% else %}
{% if 'class_' in kwargs and 'validate' not in kwargs['class_'] %}
{% set tmp = kwargs.update({'class_': kwargs['class_'] + ' validate'}) %}
{% else %}
{% set tmp = kwargs.update({'class_': 'validate'}) %}
{% endif %}
{{ render_generic_field(field, *args, **kwargs) }}
{% endif %}
{% endmacro %}
{% macro render_boolean_field(field) %}
{% set label = kwargs.pop('label', True) %}
<div class="switch">
{% if 'material_icon' in kwargs %}
<i class="material-icons prefix">{{ kwargs.pop('material_icon') }}</i>
{% endif %}
<label>
{{ field(*args, **kwargs) }}
<span class="lever"></span>
{% if label %}
{{ field.label.text }}
{% endif %}
</label>
{% for error in field.errors %}
<span class="helper-text red-text">{{ error }}</span>
{% endfor %}
</div>
{% endmacro %}
{% macro render_file_field(field) %}
{% set placeholder = kwargs.pop('placeholder', '') %}
<div class="file-field input-field">
<div class="btn">
<span>{{ field.label.text }}</span>
{{ field(*args, **kwargs) }}
</div>
<div class="file-path-wrapper">
<input class="file-path validate" type="text" placeholder="{{ placeholder }}">
</div>
{% for error in field.errors %}
<span class="helper-text red-text">{{ error }}</span>
{% endfor %}
</div>
{% endmacro %}
{% macro render_generic_field(field) %}
{% if field.type == 'TextAreaField' and 'materialize-textarea' not in kwargs['class_'] %}
{% set tmp = kwargs.update({'class_': kwargs['class_'] + ' materialize-textarea'}) %}
{% elif field.type == 'IntegerField' %}
{% set tmp = kwargs.update({'type': 'number'}) %}
{% endif %}
{% set label = kwargs.pop('label', True) %}
<div class="input-field">
{% if 'material_icon' in kwargs %}
<i class="material-icons prefix">{{ kwargs.pop('material_icon') }}</i>
{% endif %}
{{ field(*args, **kwargs) }}
{% if label %}
{{ field.label }}
{% endif %}
{% for error in field.errors %}
<span class="helper-text red-text">{{ error }}</span>
{% endfor %}
</div>
{% endmacro %}
{% macro render_submit_field(field) %}
{% if 'class_' in kwargs and 'btn' not in kwargs['class_'] %}
{% set tmp = kwargs.update({'class_': kwargs['class_'] + ' btn'}) %}
{% else %}
{% set tmp = kwargs.update({'class_': 'btn'}) %}
{% endif %}
{% if 'waves-effect' not in kwargs['class_'] %}
{% set tmp = kwargs.update({'class_': kwargs['class_'] + ' waves-effect'}) %}
{% endif %}
{% if 'waves-light' not in kwargs['class_'] %}
{% set tmp = kwargs.update({'class_': kwargs['class_'] + ' waves-light'}) %}
{% endif %}
<button class="{{ kwargs['class_'] }}"
id="{{ field.id }}"
name="{{ field.name }}"
type="submit"
value="{{ field.label.text }}"
{% if 'style' in kwargs %}
style="{{ kwargs.pop('style') }}"
{% endif %}>
{{ field.label.text }}
{% if 'material_icon' in kwargs %}
<i class="material-icons right">{{ kwargs.pop('material_icon') }}</i>
{% endif %}
</button>
{% endmacro %}

View File

@ -1,300 +1,219 @@
{% import "utils/macros.html.j2" as Macros %}
{% import "utils/materialize.html.j2" as M %}
{% extends "materialize/base.html.j2" %}
{% from '_variables.html.j2' import colors %}
{% block html_attribs %} lang="en"{% endblock html_attribs %}
{% if title is not defined %}
{% set title = None %}
{% block head %}
{{ super() }}
<link href="{{ url_for('static', filename='images/nopaque_-_favicon.png') }}" rel="icon">
{% endblock head %}
{% block metas %}
<meta charset="UTF-8">
{{ super() }}
{% endblock metas %}
{% block title %}{% if request.path != url_for('main.index') and title is defined %}{{title}} | {% endif %}nopaque{% endblock title %}
{% block styles %}
{{ super() }}
{% if current_user.is_authenticated %}
<link href="{{ url_for('static', filename='css/materialize.fix.sidenav-fixed.css') }}" media="screen,projection" rel="stylesheet">
{% endif %}
<link href="{{ url_for('static', filename='css/materialize.fix.sticky-footer.css') }}" media="screen,projection" rel="stylesheet">
<link href="{{ url_for('static', filename='css/nopaque.css') }}" media="screen,projection" rel="stylesheet">
<style>
.primary-color {background-color: {{ colors.primary }} !important;}
.primary-color-text {color: {{ colors.primary }} !important;}
.secondary-color {background-color: {{ colors.secondary }} !important;}
.secondary-color-text {color: {{ colors.secondary }} !important;}
{% if headline is not defined %}
{% set headline = title %}
{% endif %}
.corpus-analysis-color {background-color: {{ colors.corpus_analysis }} !important;}
.corpus-analysis-color-text {color: {{ colors.corpus_analysis }} !important;}
.corpus-analysis-color.darken {background-color: {{ colors.corpus_analysis_darken }} !important;}
.corpus-analysis-color-text.text-darken {color: {{ colors.corpus_analysis_darken }} !important;}
.corpus-analysis-color.lighten {background-color: {{ colors.corpus_analysis_lighten }} !important;}
.corpus-analysis-color-text.text-lighten {color: {{ colors.corpus_analysis_lighten }} !important;}
{% if parallax is not defined %}
{% set parallax = False %}
{% endif %}
.file-setup-color {background-color: {{ colors.file_setup }} !important;}
.file-setup-color-text {color: {{ colors.file_setup }} !important;}
.file-setup-color.darken {background-color: {{ colors.file_setup_darken }} !important;}
.file-setup-color-text.text-darken {color: {{ colors.file_setup_darken }} !important;}
.file-setup-color.lighten {background-color: {{ colors.file_setup_lighten }} !important;}
.file-setup-color-text.text-lighten {color: {{ colors.file_setup_lighten }} !important;}
{% if main_class is not defined %}
{% set main_class = 'grey lighten-5' %}
{% endif %}
.ocr-color {background-color: {{ colors.ocr }} !important;}
.ocr-color-text {color: {{ colors.ocr }} !important;}
.ocr-color.darken {background-color: {{ colors.ocr_darken }} !important;}
.ocr-color-text.text-darken {color: {{ colors.ocr_darken }} !important;}
.ocr-color.lighten {background-color: {{ colors.ocr_lighten }} !important;}
.ocr-color-text.text-lighten {color: {{ colors.ocr_lighten }} !important;}
{% set primary_color = '#00426f' %}
{% set secondary_color = '#b1b3b4' %}
.nlp-color {background-color: {{ colors.nlp }} !important;}
.nlp-color-text {color: {{ colors.nlp }} !important;}
.nlp-color.darken {background-color: {{ colors.nlp_darken }} !important;}
.nlp-color-text.text-darken {color: {{ colors.nlp_darken }} !important;}
.nlp-color.lighten {background-color: {{ colors.nlp_lighten }} !important;}
.nlp-color-text.text-lighten {color: {{ colors.nlp_lighten }} !important;}
{% set corpus_analysis_color = '#aa9cc9' %}
{% set corpus_analysis_color_darken = '#6b3f89' %}
{% set corpus_analysis_color_lighten = '#ebe8f6' %}
.pagination li.active {background-color: {{ colors.primary }};}
.table-of-contents a.active {border-color: {{ colors.primary }};}
.tabs .tab a {color: inherit; /* Custom Text Color */}
.tabs .tab a:hover {color: {{ colors.primary }}; /* Custom Color On Hover */}
.tabs .tab a.active, .tabs .tab a:focus.active {
color: {{ colors.primary }}; /* Custom Text Color While Active */
background-color: {{ colors.primary }}28; /* Custom Background Color While Active */
}
.tabs .indicator {background-color: {{ colors.primary }}; /* Custom Color Of Indicator */}
</style>
{% endblock styles %}
{% set file_setup_color = '#d5dc95' %}
{% set file_setup_color_darken = '#a1b300' %}
{% set file_setup_color_lighten = '#f2f3e1' %}
{% set nlp_color = '#98acd2' %}
{% set nlp_color_darken = '#0064a3' %}
{% set nlp_color_lighten = '#e5e8f5' %}
{% set ocr_color = '#a9d8c8' %}
{% set ocr_color_darken = '#00a58b' %}
{% set ocr_color_lighten = '#e7f4f1' %}
{%- macro insert_content() -%}
{% block page_content %}{% endblock %}
{%- endmacro -%}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="theme-color" content="#ee6e73">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
nopaque
{% if request.path != url_for('main.index') %} {{ title }}{% endif %}
</title>
<link rel="icon" href="{{ url_for('static', filename='images/nopaque_-_favicon.png') }}">
<!--Import Google Icon Font-->
<link rel="stylesheet" href="{{ url_for('static', filename='css/material_design_icons.min.css') }}">
<!--Import materialize.css-->
<link rel="stylesheet" href="{{ url_for('static', filename='css/materialize.min.css') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='css/nopaque.css') }}">
<style>
.primary-color {background-color: {{ primary_color }} !important;}
.primary-color-text {color: {{ primary_color }} !important;}
.secondary-color {background-color: {{ secondary_color }} !important;}
.secondary-color-text {color: {{ secondary_color }} !important;}
.corpus-analysis-color {background-color: {{ corpus_analysis_color }} !important;}
.corpus-analysis-color-text {color: {{ corpus_analysis_color }} !important;}
.corpus-analysis-color.darken {background-color: {{ corpus_analysis_color_darken }} !important;}
.corpus-analysis-color-text.text-darken {color: {{ corpus_analysis_color_darken }} !important;}
.corpus-analysis-color.lighten {background-color: {{ corpus_analysis_color_lighten }} !important;}
.corpus-analysis-color-text.text-lighten {color: {{ corpus_analysis_color_lighten }} !important;}
.file-setup-color {background-color: {{ file_setup_color }} !important;}
.file-setup-color-text {color: {{ file_setup_color }} !important;}
.file-setup-color.darken {background-color: {{ file_setup_color_darken }} !important;}
.file-setup-color-text.text-darken {color: {{ file_setup_color_darken }} !important;}
.file-setup-color.lighten {background-color: {{ file_setup_color_lighten }} !important;}
.file-setup-color-text.text-lighten {color: {{ file_setup_color_lighten }} !important;}
.ocr-color {background-color: {{ ocr_color }} !important;}
.ocr-color-text {color: {{ ocr_color }} !important;}
.ocr-color.darken {background-color: {{ ocr_color_darken }} !important;}
.ocr-color-text.text-darken {color: {{ ocr_color_darken }} !important;}
.ocr-color.lighten {background-color: {{ ocr_color_lighten }} !important;}
.ocr-color-text.text-lighten {color: {{ ocr_color_lighten }} !important;}
.nlp-color {background-color: {{ nlp_color }} !important;}
.nlp-color-text {color: {{ nlp_color }} !important;}
.nlp-color.darken {background-color: {{ nlp_color_darken }} !important;}
.nlp-color-text.text-darken {color: {{ nlp_color_darken }} !important;}
.nlp-color.lighten {background-color: {{ nlp_color_lighten }} !important;}
.nlp-color-text.text-lighten {color: {{ nlp_color_lighten }} !important;}
.pagination li.active {background-color: {{ primary_color }};}
.table-of-contents a.active {border-color: {{ primary_color }};}
.tabs .tab a {color: inherit; /* Custom Text Color */}
.tabs .tab a:hover {color: {{ primary_color }}; /* Custom Color On Hover */}
.tabs .tab a.active, .tabs .tab a:focus.active {
color: {{ primary_color }}; /* Custom Text Color While Active */
background-color: {{ primary_color }}28; /* Custom Background Color While Active */
}
.tabs .indicator {background-color: {{ primary_color }}; /* Custom Color Of Indicator */}
{% if current_user.is_authenticated %}
/*
* ### Start sidenav-fixed offset ###
* The sidenav-fixed class is used which causes the sidenav to be fixed and open
* on large screens and hides to the regular functionality on smaller screens.
* In order to prevent the sidenav to overlap the content, the content (in our
* case header, main and footer) gets an offset equal to the width of the
* sidenav.
*/
@media only screen and (min-width : 993px) {
header, main, footer {padding-left: 300px;}
.modal:not(.bottom-sheet) {left: 300px;}
.navbar-fixed > nav {width: calc(100% - 300px)}
}
/* ### End sidenav-fixed offset ### */
{% endif %}
</style>
</head>
<body>
<header>
<div class="navbar-fixed">
<nav class="nav-extended primary-color white-text">
<div class="nav-wrapper">
<a href="{{ url_for('main.index') }}" class="brand-logo hide-on-med-and-down" style="height: 100%; overflow: hidden;"><img src="{{ url_for('static', filename='images/nopaque_-_logo_name_slogan.svg') }}" style="height: 128px; margin-top: -32px;"></a>
<a href="{{ url_for('main.index') }}" class="brand-logo hide-on-large-only" style="height: 100%; overflow: hidden;"><img src="{{ url_for('static', filename='images/nopaque_-_logo.svg') }}" style="height: 128px; margin-top: -32px;"></a>
{% if current_user.is_authenticated %}
<a href="#" data-target="sidenav-main" class="sidenav-trigger"><i class="material-icons">menu</i></a>
{% endif %}
<ul class="right">
{% if current_user.is_authenticated %}
<li>
<a id="nav-notifications" class="dropdown-trigger no-autoinit" href="{{ url_for('main.news') }}" data-target="nav-notifications-dropdown">
<span class="hide-on-small-only">News</span>
<i class="material-icons right">notifications</i>
</a>
</li>
{% endif %}
<li>
<a id="nav-account" class="dropdown-trigger no-autoinit" href="#!" data-target="nav-account-dropdown">
{% if current_user.is_authenticated %}
<span class="hide-on-small-only">{{ current_user.username }}</span><i class="material-icons right">account_circle</i>
{% else %}
<i class="material-icons">account_circle</i>
{% endif %}
</a>
</li>
</ul>
</div>
<div class="nav-content">
<noscript>
<div class="card z-depth-0" style="background-color: inherit;">
<div class="card-content">
<span class="card-title">JavaScript is disabled</span>
<p>
You have JavaScript disabled. Nopaque uses javascript and
sockets to send data in realtime to you. For example showing
you the status of your jobs and your corpora.
Please activate JavaScript to make full use of nopaque.</p>
<p>Some services are still useable without Javascript.</p>
</div>
<div class="card-action">
<a href="#">What services can I still use?</a>
<a href="#">What services and functions are not available?</a>
</div>
</div>
</noscript>
</div>
</nav>
</div>
<!-- Dropdown menus for the navbar -->
<div id="nav-notifications-dropdown" class="dropdown-content">
<li>
<a href="{{ url_for('main.news', _anchor='beta-launch') }}"><i class="material-icons">error_outline</i>nopaque's beta launch</a>
</li>
</div>
<ul id="nav-account-dropdown" class="dropdown-content">
{% block navbar %}
<header>
<div class="navbar-fixed">
<nav class="nav-extended">
<div class="nav-wrapper primary-color">
{% if current_user.is_authenticated %}
<li><a href="{{ url_for('profile.settings') }}"><i class="material-icons">settings</i>Settings</a></li>
<li><a href="{{ url_for('auth.logout') }}"><i class="material-icons">power_settings_new</i>Log out</a></li>
{% else %}
<li><a href="{{ url_for('auth.login') }}"><i class="material-icons">login</i>Log in</a></li>
<li><a href="{{ url_for('auth.register') }}"><i class="material-icons">assignment</i>Register</a></li>
{% endif %}
</ul>
<ul id="sidenav-main" class="sidenav sidenav-fixed{% if not current_user.is_authenticated %} hide{% endif %}">
<li><a href="{{ url_for('main.index') }}"><i class="material-icons">opacity</i>nopaque</a></li>
<li><a href="#"><i class="material-icons">linear_scale</i>Workflow</a></li>
<li><a href="{{ url_for('main.dashboard') }}"><i class="material-icons">dashboard</i>Dashboard</a></li>
<li><a href="{{ url_for('main.dashboard', _anchor='corpora') }}" style="padding-left: 47px;"><i class="material-icons">book</i>My Corpora</a></li>
<li><a href="{{ url_for('main.dashboard', _anchor='jobs') }}" style="padding-left: 47px;"><i class="material-icons">work</i>My Jobs</a></li>
<li><div class="divider"></div></li>
<li><a class="subheader">Processes & Services</a></li>
<li style="background-color: {{ file_setup_color }}; border-left: 10px solid {{ file_setup_color_darken }};"><a href="{{ url_for('services.service', service='file-setup') }}"><i class="material-icons">burst_mode</i>File setup</a></li>
<li style="background-color: {{ ocr_color }}; border-left: 10px solid {{ ocr_color_darken }}; margin-top: 5px;"><a href="{{ url_for('services.service', service='ocr') }}"><i class="material-icons">find_in_page</i>OCR</a></li>
<li style="background-color: {{ nlp_color }}; border-left: 10px solid {{ nlp_color_darken }}; margin-top: 5px;"><a href="{{ url_for('services.service', service='nlp') }}"><i class="material-icons">format_textdirection_l_to_r</i>NLP</a></li>
<li style="background-color: {{ corpus_analysis_color }}; border-left: 10px solid {{ corpus_analysis_color_darken }}; margin-top: 5px;"><a href="{{ url_for('services.service', service='corpus_analysis') }}"><i class="material-icons">search</i>Corpus analysis</a></li>
<li><div class="divider"></div></li>
<li><a class="subheader">Account</a></li>
{% if current_user.is_authenticated %}
<li><a href="{{ url_for('profile.settings') }}"><i class="material-icons">settings</i>Settings</a></li>
<li><a href="{{ url_for('auth.logout') }}"><i class="material-icons">power_settings_new</i>Log out</a></li>
{% else %}
<li><a href="{{ url_for('auth.login') }}"><i class="material-icons">person</i>Log in</a></li>
<li><a href="{{ url_for('auth.register') }}"><i class="material-icons">person_add</i>Register</a></li>
{% endif %}
{% if current_user.is_administrator() %}
<li><div class="divider"></div></li>
<li><a class="subheader">Administration</a></li>
<li><a href="{{ url_for('admin.index') }}"><i class="material-icons">build</i>Administration tools</a></li>
{% endif %}
</ul>
</header>
{% if parallax %}
<main>
{{ insert_content() }}
</main>
{% else %}
<main class="{{ main_class }}">
{% if not full_width %}
<div class="container">
{% endif %}
<div class="row">
<div class="col s12" id="headline">
<h2>{{ headline }}</h2>
</div>
{{ insert_content() }}
</div>
{% if not full_width %}
</div>
<a href="#" data-target="sidenav" class="sidenav-trigger"><i class="material-icons">menu</i></a>
{% endif %}
<a href="{{ url_for('main.index') }}" class="brand-logo hide-on-med-and-down" style="height: 100%; overflow: hidden;"><img src="{{ url_for('static', filename='images/nopaque_-_logo_name_slogan.svg') }}" style="height: 128px; margin-top: -32px;"></a>
<a href="{{ url_for('main.index') }}" class="brand-logo hide-on-large-only" style="height: 100%; overflow: hidden;"><img src="{{ url_for('static', filename='images/nopaque_-_logo.svg') }}" style="height: 128px; margin-top: -32px;"></a>
<ul class="right hide-on-med-and-down">
<li{% if request.path == url_for('main.news') %} class="active"{% endif %}><a href="{{ url_for('main.news') }}"><i class="material-icons left">notifications</i>News</a></li>
{% if current_user.is_anonymous %}
<li{% if request.path == url_for('auth.register') %} class="active"{% endif %}><a href="{{ url_for('auth.register') }}"><i class="material-icons left">assignment</i>Register</a></li>
<li{% if request.path == url_for('auth.login') %} class="active"{% endif %}><a href="{{ url_for('auth.login') }}"><i class="material-icons left">login</i>Log in</a></li>
{% else %}
<li{% if request.path == url_for('main.dashboard', _anchor='corpora') %} class="active"{% endif %}><a href="{{ url_for('main.dashboard', _anchor='corpora') }}"><i class="material-icons left">book</i>My Corpora</a></li>
<li{% if request.path == url_for('main.dashboard', _anchor='jobs') %} class="active"{% endif %}><a href="{{ url_for('main.dashboard', _anchor='jobs') }}"><i class="material-icons left">work</i>My Jobs</a></li>
<li><a class="dropdown-trigger no-autoinit" data-target="nav-more-dropdown" href="#!" id="nav-more-dropdown-trigger"><i class="material-icons">more_vert</i></a></li>
{% endif %}
</ul>
</div>
{% endif %}
</main>
<div class="nav-content secondary-color">
{% block nav_content %}{% endblock nav_content %}
</div>
</nav>
</div>
<footer class="page-footer secondary-color white-text">
<div class="container">
<div class="row">
<div class="col s6 m3">
<a href="https://www.dfg.de/">
<img class="responsive-img" src="{{ url_for('static', filename='images/logo_-_dfg.gif') }}">
</a>
</div>
<div class="col s6 m3 offset-m1 center-align">
<a href="https://www.uni-bielefeld.de/sfb1288/">
<img class="responsive-img" src="{{ url_for('static', filename='images/logo_-_sfb_1288.png') }}">
</a>
</div>
<div class="col s12 m3 offset-m1">
<h5 class="white-text">Legal Notice</h5>
<ul>
<li><a class="grey-text text-lighten-3" href="https://www.uni-bielefeld.de/(en)/impressum/">Legal Notice</a></li>
<li><a class="grey-text text-lighten-3" href="{{ url_for('main.privacy_policy') }}">Privacy statement (GDPR)</a></li>
<li><a class="grey-text text-lighten-3" href="{{ url_for('main.terms_of_use') }}">Terms of use</a></li>
<li></li>
</ul>
</div>
{% if current_user.is_authenticated %}
<ul class="dropdown-content" id="nav-more-dropdown">
<li><a href="{{ url_for('profile.settings') }}"><i class="material-icons left">settings</i>Settings</a></li>
<li class="divider" tabindex="-1"></li>
<li><a href="{{ url_for('auth.logout') }}">Log out</a></li>
</ul>
{% endif %}
</header>
{% endblock navbar %}
{% block sidenav %}
<ul class="sidenav sidenav-fixed{% if not current_user.is_authenticated %} hide{% endif %}" id="sidenav">
{% if current_user.is_authenticated %}
<li>
<div class="user-view">
<div class="background primary-color"></div>
<span class="white-text name">{{ current_user.username }}</span>
<span class="white-text email">{{ current_user.email }}</span>
</div>
</li>
<li><a href="#"><i class="material-icons">linear_scale</i>Workflow</a></li>
<li><a href="{{ url_for('main.dashboard') }}"><i class="material-icons">dashboard</i>Dashboard</a></li>
<li><a href="{{ url_for('main.dashboard', _anchor='corpora') }}" style="padding-left: 47px;"><i class="material-icons">book</i>My Corpora</a></li>
<li><a href="{{ url_for('main.dashboard', _anchor='jobs') }}" style="padding-left: 47px;"><i class="material-icons">work</i>My Jobs</a></li>
<li><div class="divider"></div></li>
<li><a class="subheader">Processes & Services</a></li>
<li style="background-color: {{ colors.file_setup }}; border-left: 10px solid {{ colors.file_setup_darken }};"><a href="{{ url_for('services.service', service='file-setup') }}"><i class="material-icons">burst_mode</i>File setup</a></li>
<li style="background-color: {{ colors.ocr }}; border-left: 10px solid {{ colors.ocr_darken }}; margin-top: 5px;"><a href="{{ url_for('services.service', service='ocr') }}"><i class="material-icons">find_in_page</i>OCR</a></li>
<li style="background-color: {{ colors.nlp }}; border-left: 10px solid {{ colors.nlp_darken }}; margin-top: 5px;"><a href="{{ url_for('services.service', service='nlp') }}"><i class="material-icons">format_textdirection_l_to_r</i>NLP</a></li>
<li style="background-color: {{ colors.corpus_analysis }}; border-left: 10px solid {{ colors.corpus_analysis_darken }}; margin-top: 5px;"><a href="{{ url_for('services.service', service='corpus_analysis') }}"><i class="material-icons">search</i>Corpus analysis</a></li>
<li class="hide-on-large-only"><div class="divider"></div></li>
<li class="hide-on-large-only"><a href="{{ url_for('profile.settings') }}"><i class="material-icons">settings</i>Settings</a></li>
<li class="hide-on-large-only"><a href="{{ url_for('auth.logout') }}">Log out</a></li>
{% else %}
<li class="hide-on-large-only"><a href="{{ url_for('auth.register') }}"><i class="material-icons">assignment</i>Register</a></li>
<li class="hide-on-large-only"><a href="{{ url_for('auth.login') }}"><i class="material-icons">login</i>Log in</a></li>
{% endif %}
{% if current_user.is_administrator() %}
<li><div class="divider"></div></li>
<li><a class="subheader">Administration</a></li>
<li><a href="{{ url_for('admin.index') }}"><i class="material-icons">build</i>Administration tools</a></li>
{% endif %}
</ul>
{% endblock sidenav %}
{% block content %}
<main>
{% block page_content %}{% endblock page_content %}
</main>
<footer class="page-footer secondary-color">
<div class="container">
<div class="row">
<div class="col s6 m3">
<a href="https://www.dfg.de/">
<img class="responsive-img" src="{{ url_for('static', filename='images/logo_-_dfg.gif') }}">
</a>
</div>
<div class="col s6 m3 offset-m1 center-align">
<a href="https://www.uni-bielefeld.de/sfb1288/">
<img class="responsive-img" src="{{ url_for('static', filename='images/logo_-_sfb_1288.png') }}">
</a>
</div>
<div class="col s12 m3 offset-m1">
<h5 class="white-text">Legal Notice</h5>
<ul>
<li><a class="grey-text text-lighten-3" href="https://www.uni-bielefeld.de/(en)/impressum/">Legal Notice</a></li>
<li><a class="grey-text text-lighten-3" href="{{ url_for('main.privacy_policy') }}">Privacy statement (GDPR)</a></li>
<li><a class="grey-text text-lighten-3" href="{{ url_for('main.terms_of_use') }}">Terms of use</a></li>
<li></li>
</ul>
</div>
</div>
</div>
<div class="footer-copyright primary-color">
<div class="container">
<div class="row" style="margin-bottom: 0;">
<div class="col s12 m3">
<span>© 2020 Bielefeld University</span>
</div>
<div class="col s12 m9 right-align">
<a class="btn-small blue waves-effect waves-light" href="{{ url_for('main.about_and_faq') }}"><i class="left material-icons">info_outline</i>About and faq</a>
{% if config.CONTACT_EMAIL_ADRESS %}
<a class="btn-small pink waves-effect waves-light" href="mailto:{{ config.CONTACT_EMAIL_ADRESS }}?subject=[nopaque] Contact"><i class="left material-icons">rate_review</i>Contact</a>
<a class="btn-small green waves-effect waves-light" href="mailto:{{ config.CONTACT_EMAIL_ADRESS }}?subject=[nopaque] Feedback"><i class="left material-icons">feedback</i>Feedback</a>
{% endif %}
<a class="btn-small orange waves-effect waves-light" href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque"><i class="left material-icons">code</i>GitLab</a>
</div>
</div>
<div class="footer-copyright primary-color white-text">
<div class="container">
<div class="row" style="margin-bottom: 0;">
<div class="col s12 m3">
<span>© 2020 Bielefeld University</span>
</div>
<div class="col s12 m9 right-align">
<a class="btn-small blue waves-effect waves-light" href="{{ url_for('main.about_and_faq') }}"><i class="left material-icons">info_outline</i>About and faq</a>
<a class="btn-small pink waves-effect waves-light" href="mailto:{{ config.CONTACT_EMAIL_ADRESS }}?subject={{ config.NOPAQUE_MAIL_SUBJECT_PREFIX }} Contact"><i class="left material-icons">rate_review</i>Contact</a>
<a class="btn-small green waves-effect waves-light" href="mailto:{{ config.CONTACT_EMAIL_ADRESS }}?subject={{ config.NOPAQUE_MAIL_SUBJECT_PREFIX }} Feedback"><i class="left material-icons">feedback</i>Feedback</a>
<a class="btn-small orange waves-effect waves-light" href="https://gitlab.ub.uni-bielefeld.de/sfb1288inf/opaque"><i class="left material-icons">code</i>GitLab</a>
</div>
</div>
</div>
</div>
</footer>
<script src="{{ url_for('static', filename='js/darkreader.js') }}"></script>
<script src="{{ url_for('static', filename='js/jsonpatch.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/list.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/materialize.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/socket.io.slim.js') }}"></script>
<script src="{{ url_for('static', filename='js/nopaque.js') }}"></script>
<script>
{% if current_user.is_authenticated %}
{% if current_user.setting_dark_mode %}
DarkReader.enable({brightness: 150, contrast: 100, sepia: 0});
{% endif %}
document.addEventListener('DOMContentLoaded', () => {
nopaque.socket.init();
nopaque.socket.emit('user_data_stream_init');
});
{% endif %}
nopaque.flashedMessages = {{ get_flashed_messages(with_categories=True)|tojson }};
</script>
</body>
</html>
</div>
</div>
</footer>
{% endblock content %}
{% block scripts %}
{{ super() }}
<script src="{{ url_for('static', filename='js/darkreader.js') }}"></script>
<script src="{{ url_for('static', filename='js/jsonpatch.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/list.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/socket.io.slim.js') }}"></script>
<script src="{{ url_for('static', filename='js/nopaque.js') }}"></script>
<script>
{% if current_user.setting_dark_mode %}
DarkReader.enable({brightness: 150, contrast: 100, sepia: 0});
{% endif %}
// Disable all option elements with no value
for (let optionElement of document.querySelectorAll('option[value=""]')) {
optionElement.disabled = true;
}
M.AutoInit();
M.CharacterCounter.init(document.querySelectorAll('input[data-length][type="email"], input[data-length][type="password"], input[data-length][type="text"], textarea[data-length]'));
M.Dropdown.init(document.querySelectorAll('#nav-more-dropdown-trigger'), {alignment: 'right', constrainWidth: false, coverTrigger: false});
nopaque.Forms.init();
{% if current_user.is_authenticated %}
nopaque.socket.emit('user_data_stream_init');
{% endif %}
for (let flashedMessage of {{ get_flashed_messages(with_categories=True)|tojson }}) {
nopaque.flash(flashedMessage[1], flashedMessage[0]);
}
</script>
{% endblock scripts %}