mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-11-04 04:12:45 +00:00 
			
		
		
		
	Merge branch 'visualizations-update' of gitlab.ub.uni-bielefeld.de:sfb1288inf/nopaque into visualizations-update
This commit is contained in:
		@@ -1,6 +1,8 @@
 | 
			
		||||
class CorpusAnalysisApp {
 | 
			
		||||
  constructor(corpusId) {
 | 
			
		||||
    this.data = {};
 | 
			
		||||
    this.data = {
 | 
			
		||||
      promises: {getStopwords: []}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // HTML elements
 | 
			
		||||
    this.elements = {
 | 
			
		||||
@@ -22,6 +24,49 @@ class CorpusAnalysisApp {
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // getStopwords(language) {
 | 
			
		||||
  //   if (language in this.data.promises.getStopwords) {
 | 
			
		||||
  //     console.log('Stopwords already loaded');
 | 
			
		||||
  //     return this.data.promises.getStopwords[language];
 | 
			
		||||
  //   } 
 | 
			
		||||
  //   this.data.promises.getStopwords[language] = new Promise((resolve, reject) => {
 | 
			
		||||
  //       Requests.corpora.entity.getStopwords(language)
 | 
			
		||||
  //         .then((response) => {
 | 
			
		||||
  //           response.json()
 | 
			
		||||
  //             .then((json) => {
 | 
			
		||||
  //               let stopwords = json.stopwords;
 | 
			
		||||
  //               resolve(stopwords);
 | 
			
		||||
  //             })
 | 
			
		||||
  //             .catch((error) => {
 | 
			
		||||
  //               reject(error);
 | 
			
		||||
  //             });
 | 
			
		||||
  //         });
 | 
			
		||||
  //     });
 | 
			
		||||
  //     return this.data.promises.getStopwords[language];
 | 
			
		||||
  // }
 | 
			
		||||
 | 
			
		||||
  getStopwords() {
 | 
			
		||||
    if (this.data.promises.getStopwords.length !== 0) {
 | 
			
		||||
      console.log('Stopwords already loaded');
 | 
			
		||||
      return this.data.promises.getStopwords;
 | 
			
		||||
    }
 | 
			
		||||
    this.data.promises.getStopwords = new Promise((resolve, reject) => {
 | 
			
		||||
      Requests.corpora.entity.getStopwords()
 | 
			
		||||
        .then((response) => {
 | 
			
		||||
          response.json()
 | 
			
		||||
            .then((json) => {
 | 
			
		||||
              let stopwords = json.stopwords;
 | 
			
		||||
              resolve(stopwords);
 | 
			
		||||
            })
 | 
			
		||||
            .catch((error) => {
 | 
			
		||||
              reject(error);
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    return this.data.promises.getStopwords;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  init() {
 | 
			
		||||
    this.disableActionElements();
 | 
			
		||||
    this.elements.m.initModal.open();
 | 
			
		||||
@@ -155,9 +200,28 @@ class CorpusAnalysisApp {
 | 
			
		||||
        type: 'pie'
 | 
			
		||||
      }
 | 
			
		||||
    ];
 | 
			
		||||
    let config = {responsive: true};
 | 
			
		||||
    let graphLayout = {
 | 
			
		||||
      showlegend: true,
 | 
			
		||||
      height: 486,
 | 
			
		||||
      margin: {
 | 
			
		||||
        l: 10,
 | 
			
		||||
        r: 10,
 | 
			
		||||
        b: 10,
 | 
			
		||||
        t: 10
 | 
			
		||||
      },
 | 
			
		||||
      legend: {
 | 
			
		||||
        "orientation": "h",
 | 
			
		||||
        font: {
 | 
			
		||||
          size: 10
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
    let config = {
 | 
			
		||||
      responsive: true,
 | 
			
		||||
      displaylogo: false
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    Plotly.newPlot(textProportionsGraphicElement, graphData, config);
 | 
			
		||||
    Plotly.newPlot(textProportionsGraphicElement, graphData, graphLayout, config);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  renderFrequenciesGraphic(corpusData) {
 | 
			
		||||
@@ -165,42 +229,106 @@ class CorpusAnalysisApp {
 | 
			
		||||
    let frequenciesTokenCategoryDropdownListElement = document.querySelector("#frequencies-token-category-dropdown");
 | 
			
		||||
    let frequenciesGraphicElement = document.querySelector('#frequencies-graphic');
 | 
			
		||||
    let texts = Object.entries(corpusData.s_attrs.text.lexicon);
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    let graphtype = document.querySelector('.frequencies-graph-mode-button.disabled').dataset.graphType;
 | 
			
		||||
    let graphModeButtons = document.querySelectorAll('.frequencies-graph-mode-button');
 | 
			
		||||
 | 
			
		||||
    frequenciesTokenCategoryDropdownListElement.addEventListener('click', (event) => {
 | 
			
		||||
      frequenciesTokenCategoryDropdownElement.firstChild.textContent = event.target.innerHTML;
 | 
			
		||||
      this.renderFrequenciesGraphic(corpusData);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    graphModeButtons.forEach(graphModeButton => {
 | 
			
		||||
      graphModeButton.addEventListener('click', (event) => {
 | 
			
		||||
        graphModeButtons.forEach(btn => {
 | 
			
		||||
          btn.classList.remove('disabled');
 | 
			
		||||
        });
 | 
			
		||||
        event.target.closest('.frequencies-graph-mode-button').classList.add('disabled');
 | 
			
		||||
        this.renderFrequenciesGraphic(corpusData);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    let tokenCategory = frequenciesTokenCategoryDropdownElement.firstChild.textContent.toLowerCase();
 | 
			
		||||
    
 | 
			
		||||
    let graphData = this.createFrequenciesGraphData(tokenCategory, texts, corpusData);
 | 
			
		||||
    let graphLayout = {
 | 
			
		||||
      barmode: 'stack',
 | 
			
		||||
      type: 'bar'
 | 
			
		||||
    };
 | 
			
		||||
    let config = {responsive: true};
 | 
			
		||||
    
 | 
			
		||||
    Plotly.newPlot(frequenciesGraphicElement, graphData, graphLayout, config);
 | 
			
		||||
    this.createFrequenciesGraphData(tokenCategory, texts, corpusData, graphtype)
 | 
			
		||||
      .then(graphData => {
 | 
			
		||||
        let graphLayout = {
 | 
			
		||||
          barmode: graphtype === 'bar' ? 'stack' : '',
 | 
			
		||||
          margin: {
 | 
			
		||||
            t: 20,
 | 
			
		||||
            l: 50
 | 
			
		||||
          },
 | 
			
		||||
          yaxis: {
 | 
			
		||||
            showticklabels: graphtype === 'markers' ? false : true
 | 
			
		||||
          },
 | 
			
		||||
        };
 | 
			
		||||
        let config = {
 | 
			
		||||
          responsive: true,
 | 
			
		||||
          modeBarButtonsToRemove: ['zoom2d', 'select2d', 'lasso2d', 'zoomIn2d', 'zoomOut2d', 'autoScale2d', 'resetScale2d'],
 | 
			
		||||
          displaylogo: false
 | 
			
		||||
        };
 | 
			
		||||
        Plotly.newPlot(frequenciesGraphicElement, graphData, graphLayout, config);
 | 
			
		||||
      });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  createFrequenciesGraphData(category, texts, corpusData) {
 | 
			
		||||
    let graphData = [];
 | 
			
		||||
    let sortedData = Object.entries(corpusData.corpus.freqs[category]).sort((a, b) => b[1] - a[1]).slice(0, 5);
 | 
			
		||||
  
 | 
			
		||||
    for (let item of sortedData) {
 | 
			
		||||
      let data = {
 | 
			
		||||
        x: texts.map(text => `${corpusData.values.s_attrs.text[text[0]].title} (${corpusData.values.s_attrs.text[text[0]].publishing_year})`),
 | 
			
		||||
        y: texts.map(text => text[1].freqs[category][item[0]]),
 | 
			
		||||
        name: corpusData.values.p_attrs[category][item[0]],
 | 
			
		||||
        type: 'bar'
 | 
			
		||||
      };
 | 
			
		||||
      graphData.push(data);
 | 
			
		||||
    }
 | 
			
		||||
  
 | 
			
		||||
    return graphData;
 | 
			
		||||
  createFrequenciesGraphData(category, texts, corpusData, graphtype) {
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
      this.getStopwords()
 | 
			
		||||
        .then(stopwords => {
 | 
			
		||||
          this.renderStopwordSettingsModal(stopwords);
 | 
			
		||||
          let stopwordList = [];
 | 
			
		||||
          Object.values(stopwords).forEach(stopwordItems => {
 | 
			
		||||
            stopwordItems.forEach(stopword => {
 | 
			
		||||
              stopwordList.push(stopword);
 | 
			
		||||
            });
 | 
			
		||||
          });
 | 
			
		||||
          let graphData = [];
 | 
			
		||||
          let filteredData = Object.entries(corpusData.corpus.freqs[category])
 | 
			
		||||
            .sort((a, b) => b[1] - a[1])
 | 
			
		||||
            .filter(item => !stopwordList.includes(corpusData.values.p_attrs[category][item[0]].toLowerCase()))
 | 
			
		||||
            .slice(0, 5);
 | 
			
		||||
          if (graphtype !== 'markers') {
 | 
			
		||||
            for (let item of filteredData) {
 | 
			
		||||
              let data = {
 | 
			
		||||
                x: texts.map(text => `${corpusData.values.s_attrs.text[text[0]].title} (${corpusData.values.s_attrs.text[text[0]].publishing_year})`),
 | 
			
		||||
                y: texts.map(text => text[1].freqs[category][item[0]] || 0),
 | 
			
		||||
                name: corpusData.values.p_attrs[category][item[0]],
 | 
			
		||||
                type: graphtype
 | 
			
		||||
              };
 | 
			
		||||
              graphData.push(data);
 | 
			
		||||
            }
 | 
			
		||||
          } else {
 | 
			
		||||
            for (let item of filteredData) {
 | 
			
		||||
              let size = texts.map(text => text[1].freqs[category][item[0]] || 0); 
 | 
			
		||||
              let data = {
 | 
			
		||||
                x: texts.map(text => `${corpusData.values.s_attrs.text[text[0]].title} (${corpusData.values.s_attrs.text[text[0]].publishing_year})`),
 | 
			
		||||
                y: texts.map(text => corpusData.values.p_attrs[category][item[0]]),
 | 
			
		||||
                name: corpusData.values.p_attrs[category][item[0]],
 | 
			
		||||
                text: texts.map(text => `${corpusData.values.p_attrs[category][item[0]]}<br>${text[1].freqs[category][item[0]] || 0}`),
 | 
			
		||||
                mode: 'markers',
 | 
			
		||||
                marker: {
 | 
			
		||||
                  size: size,
 | 
			
		||||
                  // sizeref: 2.0 * Math.max(...size) / (80**2),
 | 
			
		||||
                  // sizemode: 'area',
 | 
			
		||||
                  sizeref: 0.2
 | 
			
		||||
                }
 | 
			
		||||
              };
 | 
			
		||||
              graphData.push(data);
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          resolve(graphData);
 | 
			
		||||
        })
 | 
			
		||||
        .catch(error => {
 | 
			
		||||
          reject(error);
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  renderStopwordSettingsModal(stopwords) {
 | 
			
		||||
    let stopwordInputField = document.querySelector('.stopword-input-field');
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  renderBoundsGraphic(corpusData) {
 | 
			
		||||
      let boundsGraphicElement = document.querySelector('#bounds-graphic');
 | 
			
		||||
 | 
			
		||||
@@ -232,7 +360,11 @@ class CorpusAnalysisApp {
 | 
			
		||||
        }
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      let config = {responsive: true};
 | 
			
		||||
      let config = {
 | 
			
		||||
        responsive: true,
 | 
			
		||||
        modeBarButtonsToRemove: ['zoom2d', 'select2d', 'lasso2d', 'zoomIn2d', 'zoomOut2d', 'autoScale2d', 'resetScale2d'],
 | 
			
		||||
        displaylogo: false
 | 
			
		||||
      };
 | 
			
		||||
    
 | 
			
		||||
      Plotly.newPlot(boundsGraphicElement, graphData, graphLayout, config);
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -22,9 +22,11 @@ Requests.JSONfetch = (input, init={}) => {
 | 
			
		||||
          response.json()
 | 
			
		||||
            .then(
 | 
			
		||||
              (json) => {
 | 
			
		||||
                let message = json.message || json;
 | 
			
		||||
                let message = json.message;
 | 
			
		||||
                let category = json.category || 'message';
 | 
			
		||||
                app.flash(message, category);
 | 
			
		||||
                if (message) {
 | 
			
		||||
                  app.flash(message, category);
 | 
			
		||||
                }
 | 
			
		||||
              },
 | 
			
		||||
              (error) => {
 | 
			
		||||
                app.flash(`[${response.status}]: ${response.statusText}`, 'error');
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,14 @@ Requests.corpora.entity.generateShareLink = (corpusId, role, expiration) => {
 | 
			
		||||
  return Requests.JSONfetch(input, init);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Requests.corpora.entity.getStopwords = () => {
 | 
			
		||||
  let input = `/corpora/stopwords`;
 | 
			
		||||
  let init = {
 | 
			
		||||
    method: 'GET'
 | 
			
		||||
  };
 | 
			
		||||
  return Requests.JSONfetch(input, init);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
Requests.corpora.entity.isPublic = {};
 | 
			
		||||
 | 
			
		||||
Requests.corpora.entity.isPublic.update = (corpusId, isPublic) => {
 | 
			
		||||
@@ -43,4 +51,3 @@ Requests.corpora.entity.isPublic.update = (corpusId, isPublic) => {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user