2017-04-01 1 views
2

MathJax ferme son CDN, comme annoncé officiellement on the MathJax website et sur StackExchange's Meta. L'annonce officielle recommande plusieurs alternatives, y compris l'utilisation d'un CDN alternatif et l'auto-hébergement. Quelle est la meilleure façon d'accomplir ce processus pour un site avec un grand nombre de références au CDN MathJax?Mise à jour de MathJax CDN

Sur mon petit petit site, par exemple, je peux compter le nombre de fichiers que j'ai ce point à l'MathJax CDN en utilisant la commande unix suivante:

grep -rl 'cdn\.mathjax\.org/mathjax/latest/MathJax\.js' . | grep '\.html$' | wc -l 

Je trouve que j'ai 382 ces fichiers . Quel est le meilleur moyen (le plus sûr) d'automatiser le processus de traitement de ces fichiers et de modifier la source pour pointer vers le nouveau CDN plutôt que l'ancien CDN?

Remarque: Je peux utiliser Python pour parcourir l'arborescence de répertoires et effectuer des recherches et des remplacements facilement. Je suis intéressé par les techniques robustes. En fait, j'ai déjà posté une réponse personnelle qui utilise BeautifulSoup pour trouver et remplacer les liens src MathJax. C'est comme ça que j'utilise habituellement MathJax, mais il y a d'autres façons, bien sûr.

Répondre

1

Voici la première approche que j'ai inventée en Python; Je ne sais pas si c'est sûr ou inclusif. J'écris d'abord une fonction appelée update_mathjax. Cela utilise BeautifulSoup pour trouver le <head>, puis recherche un <script> dont l'attribut src pointe vers le CDN MathJax. S'il le trouve, il remplace src par un src mis à jour et réécrit le fichier.

from bs4 import BeautifulSoup as bs 
old_cdn = 'https://cdn.mathjax.org/mathjax/latest/MathJax.js' 
new_cdn = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js' 
def update_mathjax(filename): 
    with open(filename, 'r+') as file_handle: 
     file_contents = file_handle.read() 
     soup = bs(file_contents, "html5lib") 
     scripts = soup.find('head').find_all('script') 
     for script in scripts: 
      if script.attrs and 'src' in script.attrs: 
       if script.attrs['src'][:49] == old_cdn: 
         q = script.attrs['src'][49:] 
         new_src = new_cdn + q 
         script.attrs['src'] = new_src 
         file_handle.seek(0) 
         file_handle.write(soup.prettify()) 
         file_handle.truncate() 
         print('udated ' + filename) 

Avec cela, il est assez facile à parcourir l'arborescence et appliquer la fonction.

import os 
for directory_name, subdirectory_list, filename_list in os.walk(os.getcwd()): 
    for filename in filename_list: 
     if filename[-5:] == ".html": 
      update_mathjax(os.path.join(directory_name, filename)) 
+1

Merci! Chez MathJax, nous avons l'intention de passer en revue les récentes questions relatives à SO, en mentionnant cdn.mathjax.org pour ajouter des commentaires. Ce sera un message utile à lier. –

+0

@PeterKrautzberger Je suis content d'entendre ça, merci. Je l'ai exécuté sur quelques petits répertoires que j'ai et cela semble fonctionner pour mes fichiers. Si quelqu'un ne charge pas de la tête, cependant, ou peut-être utilise, cela ne fonctionnera pas. J'aimerais voir une approche robuste. –