MathJax正在关闭其CDN,正式宣布on the MathJax website和StackExchange'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的方式,当然还有其他方法。
答案 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))