正如官方宣布的那样,MathJax 将关闭其 CDN在 MathJax 网站上 and on StackExchange 的元数据。官方公告推荐了几种替代方案,包括使用替代 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的方式,当然还有其他方式。
这是我用 Python 提出的第一个方法;不确定它的安全性或包容性。我首先写了一个函数叫update_mathjax
。这使用BeautifulSoup
找到<head>
,然后搜索<script>
whose src
属性指向 MathJax CDN。如果找到它,它将替换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))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)