正在更新MathJax CDN

时间:2017-04-01 19:46:06

标签: python automation mathjax

MathJax正在关闭其CDN,正式宣布on the MathJax websiteStackExchange's Meta。官方公告推荐了几种替代方案,包括使用替代CDN和自托管。对于具有大量MathJax CDN引用的站点,完成此过程的最佳方法是什么?

例如,在我的小网站上,我可以使用以下unix命令计算我指向MathJax CDN的文件数:

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

我发现我有382个这样的文件。什么是最好(最安全)的方法来自动完成这些文件的过程并修改源指向新的CDN,而不是旧的CDN?

注意:我可以使用Python遍历目录树并轻松地进行搜索和替换。我对强大的技术很感兴趣。事实上,我已经发布了一个使用BeautifulSoup查找和替换MathJax src链接的自我回答。这是我通常使用MathJax的方式,当然还有其他方法。

1 个答案:

答案 0 :(得分:2)

这是我用Python掀起的第一种方法;不确定它是多么安全或包容。我首先编写一个名为update_mathjax的函数。这使用BeautifulSoup查找<head>,然后搜索<script>属性指向MathJax CDN的src。如果找到,则用更新的src替换src并重写该文件。

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)

这样,遍历目录树并应用该功能相当容易。

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))