code.gitea.io/gitea@v1.22.3/web_src/js/features/citation.js (about)

     1  import $ from 'jquery';
     2  import {getCurrentLocale} from '../utils.js';
     3  
     4  const {pageData} = window.config;
     5  
     6  async function initInputCitationValue(citationCopyApa, citationCopyBibtex) {
     7    const [{Cite, plugins}] = await Promise.all([
     8      import(/* webpackChunkName: "citation-js-core" */'@citation-js/core'),
     9      import(/* webpackChunkName: "citation-js-formats" */'@citation-js/plugin-software-formats'),
    10      import(/* webpackChunkName: "citation-js-bibtex" */'@citation-js/plugin-bibtex'),
    11      import(/* webpackChunkName: "citation-js-csl" */'@citation-js/plugin-csl'),
    12    ]);
    13    const {citationFileContent} = pageData;
    14    const config = plugins.config.get('@bibtex');
    15    config.constants.fieldTypes.doi = ['field', 'literal'];
    16    config.constants.fieldTypes.version = ['field', 'literal'];
    17    const citationFormatter = new Cite(citationFileContent);
    18    const lang = getCurrentLocale() || 'en-US';
    19    const apaOutput = citationFormatter.format('bibliography', {template: 'apa', lang});
    20    const bibtexOutput = citationFormatter.format('bibtex', {lang});
    21    citationCopyBibtex.setAttribute('data-text', bibtexOutput);
    22    citationCopyApa.setAttribute('data-text', apaOutput);
    23  }
    24  
    25  export async function initCitationFileCopyContent() {
    26    const defaultCitationFormat = 'apa'; // apa or bibtex
    27  
    28    if (!pageData.citationFileContent) return;
    29  
    30    const citationCopyApa = document.getElementById('citation-copy-apa');
    31    const citationCopyBibtex = document.getElementById('citation-copy-bibtex');
    32    const inputContent = document.getElementById('citation-copy-content');
    33  
    34    if ((!citationCopyApa && !citationCopyBibtex) || !inputContent) return;
    35  
    36    const updateUi = () => {
    37      const isBibtex = (localStorage.getItem('citation-copy-format') || defaultCitationFormat) === 'bibtex';
    38      const copyContent = (isBibtex ? citationCopyBibtex : citationCopyApa).getAttribute('data-text');
    39      inputContent.value = copyContent;
    40      citationCopyBibtex.classList.toggle('primary', isBibtex);
    41      citationCopyApa.classList.toggle('primary', !isBibtex);
    42    };
    43  
    44    document.getElementById('cite-repo-button')?.addEventListener('click', async (e) => {
    45      const dropdownBtn = e.target.closest('.ui.dropdown.button');
    46      dropdownBtn.classList.add('is-loading');
    47  
    48      try {
    49        try {
    50          await initInputCitationValue(citationCopyApa, citationCopyBibtex);
    51        } catch (e) {
    52          console.error(`initCitationFileCopyContent error: ${e}`, e);
    53          return;
    54        }
    55        updateUi();
    56  
    57        citationCopyApa.addEventListener('click', () => {
    58          localStorage.setItem('citation-copy-format', 'apa');
    59          updateUi();
    60        });
    61  
    62        citationCopyBibtex.addEventListener('click', () => {
    63          localStorage.setItem('citation-copy-format', 'bibtex');
    64          updateUi();
    65        });
    66  
    67        inputContent.addEventListener('click', () => {
    68          inputContent.select();
    69        });
    70      } finally {
    71        dropdownBtn.classList.remove('is-loading');
    72      }
    73  
    74      $('#cite-repo-modal').modal('show');
    75    });
    76  }