一括編集

MathJax がバージョン3になった。以前は

<script type="text/x-mathjax-config">
MathJax.Hub.Config({
  tex2jax: {
    inlineMath: [['$','$']],
    processEscapes: true
  },
  CommonHTML: { matchFontHeight: false }
});
</script>
<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_CHTML"></script>

などと書いていたものを

<script>
MathJax = {
  chtml: {
    matchFontHeight: false
  },
  tex: {
    inlineMath: [['$', '$']]
  }
};
</script>
<script id="MathJax-script" async
  src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
</script>

に一括置換したい。

上書きは怖いので,カレントディレクトリに new というサブディレクトリを作り,そこに書き出すことにした。正規表現をうまく使うことがキモである:

#! /usr/bin/env python3

import sys
import re

for arg in sys.argv[1:]:
    with open(arg) as f:
        orig = f.read()
    text = orig
    text = re.sub(r'<script type="text/x-mathjax-config">.*?</script>',
                  '''<script>
MathJax = {
  chtml: {
    matchFontHeight: false
  },
  tex: {
    inlineMath: [['$', '$']]
  }
};
</script>''', text, count=1, flags=re.MULTILINE|re.DOTALL)
    text = re.sub(r'<script async .*?</script>',
                  '''<script id="MathJax-script" async
  src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
</script>''', text, count=1)
    if text != orig:
        with open('new/' + arg, 'w') as f:
            f.write(text)

うまくいったようである。

別の例として,<pre>...</pre><pre><code>...</code></pre> に直すコード:

for arg in sys.argv[1:]:
    with open(arg) as f:
        orig = f.read()
    text = orig
    text = re.sub(r'^<pre>$', '<pre><code>', text, flags=re.MULTILINE)
    text = re.sub(r'^</pre>$', '</code></pre>', text, flags=re.MULTILINE)
    if text != orig:
        with open('new/' + arg, 'w') as f:
            f.write(text)

さらに別の例として,<pre>...</pre> の中の <code><code class="prom"> に直す:

def foo(x):
    t = x.group(0)
    while True:
        u = re.sub('<code>', '<code class="prom">', t)
        if u == t:
            return u
        t = u

for arg in sys.argv[1:]:
    with open(arg) as f:
        orig = f.read()
    text = orig
    text = re.sub(r'^<pre>$.*?^</pre>$', foo, text, flags=re.MULTILINE|re.DOTALL)
    if text != orig:
        with open('new/' + arg, 'w') as f:
            f.write(text)

Last modified: