function append()

in pontoon/machinery/static/js/machinery.js [49:194]


    function append(data) {
      let originalText = data.original;
      const sources = sourcesMap[data.original + data.translation],
        occurrencesTitle = 'Number of translation occurrences',
        translationText = data.translation;

      if (sources) {
        sources.append(
          '<li><a class="translation-source" href="' +
            data.url +
            '" target="_blank" rel="noopener noreferrer" title="' +
            data.title +
            '">' +
            '<span>' +
            data.source +
            '</span>' +
            (data.count
              ? '<sup title="' + occurrencesTitle + '">' + data.count + '</sup>'
              : '') +
            '</a></li>',
        );

        if (data.quality && sources.siblings('.stress').length === 0) {
          sources.prepend('<span class="stress">' + data.quality + '</span>');
        }
      } else {
        const originalTextForDiff = originalText;
        originalText = originalText ? diff(original, originalTextForDiff) : '';

        const li = $(
          '<li class="suggestion"' +
            ' title="Copy to clipboard"' +
            ' data-clipboard-text="' +
            self.doNotRender(translationText) +
            '">' +
            '<header>' +
            (data.quality
              ? '<span class="stress">' + data.quality + '</span>'
              : '') +
            '<ul class="sources">' +
            '<li data-source="' +
            data.source +
            '">' +
            '<a class="translation-source" href="' +
            data.url +
            '" target="_blank" rel="noopener noreferrer" title="' +
            data.title +
            '">' +
            '<span>' +
            data.source +
            '</span>' +
            (data.count
              ? '<sup title="' + occurrencesTitle + '">' + data.count + '</sup>'
              : '') +
            '</a>' +
            '</li>' +
            '</ul>' +
            '</header>' +
            '<p class="original">' +
            originalText +
            '</p>' +
            '<p class="translation" dir="' +
            self.locale.direction +
            '" lang="' +
            self.locale.code +
            '" data-script="' +
            self.locale.script +
            '">' +
            markPlaceables(translationText) +
            '</p>' +
            '<p class="translation-clipboard">' +
            self.doNotRender(translationText) +
            '</p>' +
            '</li>',
        );
        ul.append(li);
        sourcesMap[data.original + data.translation] = li.find('.sources');
        if (data.source === 'Translation memory') {
          preferred++;
        } else {
          remaining++;
        }
      }

      // Sort by quality
      const listitems = ul.children('li'),
        sourceMap = {
          'Translation memory': 1,
          'Google Translate': 2,
          'Systran Translate': 3,
          'Microsoft Translator': 4,
        };

      function getTranslationSource(el) {
        const sources = $(el).find('.translation-source span');

        if (sources.length > 1) {
          return Math.min.apply(
            Math,
            $.map(sources, function (elem) {
              return sourceMap[$(elem).text()];
            }),
          );
        } else {
          return sourceMap[sources.text()];
        }
      }

      listitems.sort(function (a, b) {
        const stressA = $(a).find('.stress'),
          stressB = $(b).find('.stress'),
          valA = stressA.length ? parseInt(stressA.html().split('%')[0]) : 0,
          valB = stressB.length ? parseInt(stressB.html().split('%')[0]) : 0,
          sourceA = getTranslationSource(a),
          sourceB = getTranslationSource(b);

        return valA < valB
          ? 1
          : valA > valB
            ? -1
            : sourceA > sourceB
              ? 1
              : sourceA < sourceB
                ? -1
                : 0;
      });

      ul.html(listitems);

      // Sort sources inside results.
      ul.find('.sources').each(function () {
        const $sourcesList = $(this),
          sources = $sourcesList.children('li'),
          sortedItems = sources.sort(function (a, b) {
            const sourceA = sourceMap[$(a).find('span').text()],
              sourceB = sourceMap[$(b).find('span').text()];
            return sourceA > sourceB ? 1 : sourceA < sourceB ? -1 : 0;
          });

        $sourcesList.children('li').remove();

        sortedItems.each(function () {
          $sourcesList.append(this);
        });
      });
    }