2017-09-06 4 views
0

Je veux vous poser des questions sur le problème avec "lettres doublées" pendant ce temps copier sur des pages avec Mathjax.Copier le texte - lettres doublées (Mathjax)

  1. Sur la première page je tente de copier MathJax formule comme ceci: Look at picture 1

Puis je reçois le Bloc-notes: ∫x2dx = 2x + C∫x2dx = 2x + C

Il copier deux fois la même formule.

  1. Sur la deuxième page, j'essaie de copier MathJax formule comme ceci: Look at picture 2

Et ici quand je copie la formule MathJax alors que je reçois dans le Bloc-notes: (x + 1) 2 =?

voici donc copier la formule correcte, il ne copie pas doublé.

Et voici ma question - quelle est la raison, cette première page donne des formules double copie pendant ce temps? C'est un gros problème pour moi, car Google a lu la formule sur la première page aussi "deux fois". Comment puis-je réparer ce problème?

(je ne peux pas mettre des liens vers ces pages, parce que j'ai trop faible réputation)

Répondre

1

Cela est dû à AssistiveMML extension de MathJax qui injecte MathML visuellement caché mais accessible dans les DOM à côté de la sortie de MathJax.

Alors que le fragment MathML obtient user-select:none (pour empêcher la copie & coller), cette fonctionnalité CSS n'est pas prise en charge sur tous les navigateurs.

En tant que lecteur, vous pouvez désactiver l'extension via le menu MathJax (Righ/Cmd-clic sur une expression) sous Accessibilité> Assisitve MathML.

0

Vous pouvez ajouter ce script pour copier des éléments MathJax comme LaTeX, ou MML directement! Il utilise jQuery, mais vous pouvez manualy supprimer:

var MathJaxRevertRendering = function(html){ 
    var $ = jQuery; 
    var stencil = $('<div>' + html + '</div>'); 
    var replaceMathJax = function(){ 
     if ($(this).parents('.mjx-chtml').length) return; 

     var math = $(this).find('math'); 
     if (math.length){ 
      var latex = math.find('annotation[encoding="LaTeX"]'); 
      if (latex.length){ 
       $(this).replaceWith('$$' + $.trim(latex.html()) + '$$'); 
      }else{ 
       $(this).replaceWith(math[0].outerHTML); 
      } 
     } 
    }; 
    if (stencil.find('.mjx-chtml').length){ 
     stencil.find('.MathJax_Preview,script').remove(); 
     stencil.find('.mjx-chtml').each(replaceMathJax); 
     html = stencil.html(); 
    } 
    return html; 
}; 

document.addEventListener('copy', function(e){ 
    var getSelectionHtml = function() { 
     var html = ""; 
     if (typeof window.getSelection != "undefined") { 
      var sel = window.getSelection(); 
      if (sel.rangeCount) { 
       var container = document.createElement("div"); 
       for (var i = 0, len = sel.rangeCount; i < len; ++i) { 
        container.appendChild(sel.getRangeAt(i).cloneContents()); 
       } 
       html = container.innerHTML; 
      } 
     } else if (typeof document.selection != "undefined") { 
      if (document.selection.type == "Text") { 
       html = document.selection.createRange().htmlText; 
      } 
     } 
     return html; 
    }; 
    var html = getSelectionHtml(); 
    var htmlLatexed = MathJaxRevertRendering(html); 
    if (html != htmlLatexed){ 
     e.clipboardData.setData('text/html', htmlLatexed); 
     var removeHTML = true; 
     e.clipboardData.setData('text/plain', htmlLatexed.split(/(<math)|(<\/math>)/).reduce(function(buffer, val){ 
      if (!val) return buffer; 
      if (val == '<math' || val == '</math>'){ 
       removeHTML = !removeHTML; 
       buffer += val; 
      }else{ 
       buffer+=removeHTML ? jQuery('<div>'+val+'</div>').text() : val; 
      } 
      return buffer; 
     }, '')); 
     e.preventDefault(); 
    } 
}); 

Et puis, tous ceux qui copie quelque chose avec l'élément MathJax sur votre site: le verra bien formaté les mathématiques, quand le coller à un éditeur.