Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

html_attribute: HTMLエンティティーが破壊される問題を修正 #7

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

akinomyoga
Copy link
Member

@akinomyoga akinomyoga changed the title [WIP] markdown_to_html.html_attribute がHTMLエンティティーを破壊する問題を修正 [WIP] html_attribute: HTMLエンティティーが破壊される問題を修正 Nov 20, 2024
@faithandbrave
Copy link
Member

手元で試してみます

@akinomyoga
Copy link
Member Author

akinomyoga commented Nov 20, 2024

解説。うろ覚えですが第1コミットの方法 (xml.etree.ElementTree.tostring) を諦めたのは HTML と XML で定義されている実体参照の集合に違いがあって思い通りにならない部分があったからの気がします。(edit: やっぱり違ったかも。空白類がちゃんと保持されないで消えたり挿入されたりするからだったような気も…)

第2コミットの方法は完全に別の方針で、今まで通りの markdown.serializers を使うけれども、内部変数の markdown.serializers.RE_AMP を一時的に書き換えて markdown.serializer を呼び出すという汚い方法です。これは、上流の markdown.serializers の内部実装に依存するので、将来上流で変更があると動かなくなる可能性があるという問題があります。

@akinomyoga
Copy link
Member Author

すみません。修正 s/root/element/ を入れました (commit & push 忘れでした)。

@faithandbrave
Copy link
Member

なるほど、markdownライブラリの最新3.7 (現在使ってるのは3.2.1) でも直ってないことは確認しました。markdownライブラリをハックして使うならこうせざるを得ない感じはしますね。

バージョン固定はしてあるので、将来バージョンアップするときのためにコメントを残しておけばよいように思います

@akinomyoga
Copy link
Member Author

この変更により影響を受けるHTML出力結果について確認しました。

数式

まず、数式 $ ~ $ の中で LaTeX 的には & と書きたい所を敢えて & などと記述している部分が & という出力結果になっています。

(これはたくさんあります)
diff --git a/reference/cfloat.html b/reference/cfloat.html
index fd2cd2efd..f88a73d46 100644
--- a/reference/cfloat.html
+++ b/reference/cfloat.html
@@ -224,11 +224,11 @@
 <p>各パラメータは以下の通り。</p>
 <p>$$
 \begin{array}{ll}
-s&amp;\text{符号($\pm 1$)}\\
-b&amp;\text{指数表現の基数(1 より大きい整数)}\\
-e&amp;\text{指数(最小 $e_{\rm min}$ 最大 $e_{\rm max}$ の整数)}\\
-p&amp;\text{精度(基数 $b$ での仮数部の桁数)}\\
-f_k&amp;\text{$b$ より小さい非負整数(仮数部の有効数字)}\\
+s&amp;amp;\text{符号($\pm 1$)}\\
+b&amp;amp;\text{指数表現の基数(1 より大きい整数)}\\
+e&amp;amp;\text{指数(最小 $e_{\rm min}$ 最大 $e_{\rm max}$ の整数)}\\
+p&amp;amp;\text{精度(基数 $b$ での仮数部の桁数)}\\
+f_k&amp;amp;\text{$b$ より小さい非負整数(仮数部の有効数字)}\\
 \end{array}
 $$</p>
 <p>浮動小数点型で表される値としては、ゼロと $f_1 \gt 0$ である正規化数の他に、$e = e_{\rm min}$ かつ $f_1 = 0$ である非正規化数(subnormal numbers)、$e \gt e_{\rm min}$ かつ $f_1 = 0$ である正規化されていない数(unnormalized numbers)、および、浮動小数点数ではない無限大や NaN 等が含まれているかもしれない(実装によっては含まれていないかもしれない)。<br />
diff --git a/reference/cfloat/dbl_decimal_dig.html b/reference/cfloat/dbl_decimal_dig.html
index a8604cf87..fe45eaa49 100644
--- a/reference/cfloat/dbl_decimal_dig.html
+++ b/reference/cfloat/dbl_decimal_dig.html
@@ -239,8 +239,8 @@
 <p>$$
 \left\{
 \begin{array}{ll}
-p \log_{10} b&amp;\text{$b$ が $10$ の累乗の場合}\\
-\lceil 1 + p \log_{10} b\rceil&amp;\text{上記以外の場合}\\
+p \log_{10} b&amp;amp;\text{$b$ が $10$ の累乗の場合}\\
+\lceil 1 + p \log_{10} b\rceil&amp;amp;\text{上記以外の場合}\\
 \end{array}
 \right.
 $$</p>
diff --git a/reference/cfloat/dbl_dig.html b/reference/cfloat/dbl_dig.html
index 4070bd9e8..06c90d1fa 100644
--- a/reference/cfloat/dbl_dig.html
+++ b/reference/cfloat/dbl_dig.html
@@ -239,8 +239,8 @@
 <p>$$
 \left\{
 \begin{array}{ll}
-p \log_{10}b&amp;\text{もし $b$ が $10$ の累乗の場合}\\
-\lfloor (p - 1) \log_{10} b\rfloor&amp;\text{上記以外の場合}\\
+p \log_{10}b&amp;amp;\text{もし $b$ が $10$ の累乗の場合}\\
+\lfloor (p - 1) \log_{10} b\rfloor&amp;amp;\text{上記以外の場合}\\
 \end{array}
 \right.
 $$</p>
diff --git a/reference/cfloat/decimal_dig.html b/reference/cfloat/decimal_dig.html
index c2a7efd05..503f8800d 100644
--- a/reference/cfloat/decimal_dig.html
+++ b/reference/cfloat/decimal_dig.html
@@ -239,8 +239,8 @@
 <p>$$
 \left\{
 \begin{array}{ll}
-p_{\rm max} \log_{10} b&amp;\text{$b$ が $10$ の累乗の場合}\\
-\lceil 1 + p_{\rm max}\log_{10} b\rceil&amp;\text{上記以外の場合}\\
+p_{\rm max} \log_{10} b&amp;amp;\text{$b$ が $10$ の累乗の場合}\\
+\lceil 1 + p_{\rm max}\log_{10} b\rceil&amp;amp;\text{上記以外の場合}\\
 \end{array}
 \right.
 $$</p>
diff --git a/reference/cfloat/flt_decimal_dig.html b/reference/cfloat/flt_decimal_dig.html
index c49e461c2..ae3b47acd 100644
--- a/reference/cfloat/flt_decimal_dig.html
+++ b/reference/cfloat/flt_decimal_dig.html
@@ -239,8 +239,8 @@
 <p>$$
 \left\{
 \begin{array}{ll}
-p \log_{10} b&amp;\text{$b$ が $10$ の累乗の場合}\\
-\lceil 1 + p \log_{10} b\rceil&amp;\text{上記以外の場合}\\
+p \log_{10} b&amp;amp;\text{$b$ が $10$ の累乗の場合}\\
+\lceil 1 + p \log_{10} b\rceil&amp;amp;\text{上記以外の場合}\\
 \end{array}
 \right.
 $$</p>
diff --git a/reference/cfloat/flt_dig.html b/reference/cfloat/flt_dig.html
index 12ceae3ec..4ef814b30 100644
--- a/reference/cfloat/flt_dig.html
+++ b/reference/cfloat/flt_dig.html
@@ -239,8 +239,8 @@
 <p>$$
 \left\{
 \begin{array}{ll}
-p \log_{10}b&amp;\text{もし $b$ が $10$ の累乗の場合}\\
-\lfloor (p - 1) \log_{10} b\rfloor&amp;\text{上記以外の場合}\\
+p \log_{10}b&amp;amp;\text{もし $b$ が $10$ の累乗の場合}\\
+\lfloor (p - 1) \log_{10} b\rfloor&amp;amp;\text{上記以外の場合}\\
 \end{array}
 \right.
 $$</p>
diff --git a/reference/cfloat/ldbl_decimal_dig.html b/reference/cfloat/ldbl_decimal_dig.html
index b0d863e99..4653332a5 100644
--- a/reference/cfloat/ldbl_decimal_dig.html
+++ b/reference/cfloat/ldbl_decimal_dig.html
@@ -239,8 +239,8 @@
 <p>$$
 \left\{
 \begin{array}{ll}
-p \log_{10} b&amp;\text{$b$ が $10$ の累乗の場合}\\
-\lceil 1 + p \log_{10} b\rceil&amp;\text{上記以外の場合}\\
+p \log_{10} b&amp;amp;\text{$b$ が $10$ の累乗の場合}\\
+\lceil 1 + p \log_{10} b\rceil&amp;amp;\text{上記以外の場合}\\
 \end{array}
 \right.
 $$</p>
diff --git a/reference/cfloat/ldbl_dig.html b/reference/cfloat/ldbl_dig.html
index f42bca1d1..5cc2ebce6 100644
--- a/reference/cfloat/ldbl_dig.html
+++ b/reference/cfloat/ldbl_dig.html
@@ -239,8 +239,8 @@
 <p>$$
 \left\{
 \begin{array}{ll}
-p \log_{10}b&amp;\text{もし $b$ が $10$ の累乗の場合}\\
-\lfloor (p - 1) \log_{10} b\rfloor&amp;\text{上記以外の場合}\\
+p \log_{10}b&amp;amp;\text{もし $b$ が $10$ の累乗の場合}\\
+\lfloor (p - 1) \log_{10} b\rfloor&amp;amp;\text{上記以外の場合}\\
 \end{array}
 \right.
 $$</p>
diff --git a/reference/cmath/acos.html b/reference/cmath/acos.html
index 67ff2e28d..8b9e7ceaa 100644
--- a/reference/cmath/acos.html
+++ b/reference/cmath/acos.html
@@ -324,9 +324,9 @@ acos(-1.0) = 3.141593
 </ul>
 <h2>実装例</h2>
 <p>以下のマクローリン級数を適当な次数で打ち切ることで近似的に求めることができる。</p>
-<p>$$ \mathrm{Arccos}~x = \frac{\pi}{2} - \sum_{n = 0}^{\infty}\frac{\left(2n\right)!}{4^n\left(n!\right)^2\left(2n + 1\right)}x^{2n+1} \quad \mathrm{for} \; |x| &lt; 1 $$</p>
+<p>$$ \mathrm{Arccos}~x = \frac{\pi}{2} - \sum_{n = 0}^{\infty}\frac{\left(2n\right)!}{4^n\left(n!\right)^2\left(2n + 1\right)}x^{2n+1} \quad \mathrm{for} \; |x| &amp;lt; 1 $$</p>
 <p>また、逆正接関数と逆余接関数の和は π / 2 なので <code><a href="asin.html">asin</a></code> から求めることができる。</p>
-<p>$$ \mathrm{Arccos}~x = \frac{\pi}{2} - \mathrm{Arcsin}~x \quad \mathrm{for} \; |x| &lt; 1 $$</p>
+<p>$$ \mathrm{Arccos}~x = \frac{\pi}{2} - \mathrm{Arcsin}~x \quad \mathrm{for} \; |x| &amp;lt; 1 $$</p>
 <h2>参照</h2>
 <ul>
 <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1467r9.html" target="_blank">P1467R9 Extended floating-point types and standard names</a><ul>
diff --git a/reference/cmath/acosh.html b/reference/cmath/acosh.html
index 70f6a7ad7..13fd10506 100644
--- a/reference/cmath/acosh.html
+++ b/reference/cmath/acosh.html
@@ -317,7 +317,7 @@ acosh(∞)  = inf
 </ul>
 <h2>実装例</h2>
 <p>対数に変換して求めることができる。</p>
-<p>$$ \mathrm{arcosh}~x = \log_e \left(x + \sqrt{x^2-1}\right) \quad \mathrm{for} \; 1 &lt; x $$</p>
+<p>$$ \mathrm{arcosh}~x = \log_e \left(x + \sqrt{x^2-1}\right) \quad \mathrm{for} \; 1 &amp;lt; x $$</p>
 <h2>参照</h2>
 <ul>
 <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1467r9.html" target="_blank">P1467R9 Extended floating-point types and standard names</a><ul>
diff --git a/reference/cmath/asin.html b/reference/cmath/asin.html
index c6bcc5475..9392dbb81 100644
--- a/reference/cmath/asin.html
+++ b/reference/cmath/asin.html
@@ -322,7 +322,7 @@ asin(1.0)   = 1.570796
 </ul>
 <h2>実装例</h2>
 <p>以下のマクローリン級数を適当な次数で打ち切ることで近似的に求めることができる。</p>
-<p>$$ \mathrm{Arcsin}~x = \sum_{n = 0}^{\infty} \frac{(2n)!}{4^n (n!)^2 (2n+1)} x^{2n + 1} \quad \mathrm{for} \; |x| &lt; 1 $$</p>
+<p>$$ \mathrm{Arcsin}~x = \sum_{n = 0}^{\infty} \frac{(2n)!}{4^n (n!)^2 (2n+1)} x^{2n + 1} \quad \mathrm{for} \; |x| &amp;lt; 1 $$</p>
 <p>$|x| = 1$ 近傍の精度低下する領域(特に $1 / \sqrt{2} &lt; |x| \le 1$)においては、以下の公式による変換で精度向上を図れる。</p>
 <p>$$ \mathrm{Arcsin}~x = \frac{\pi}{2} - \mathrm{Arccos}~x = \frac{\pi}{2} - \mathrm{Arcsin}~\sqrt{1 - x^2} \quad \mathrm{for} \; 0 \le x \le 1 $$</p>
 <h2>参照</h2>
diff --git a/reference/cmath/asinh.html b/reference/cmath/asinh.html
index 4af0a4a5a..fd20ffefe 100644
--- a/reference/cmath/asinh.html
+++ b/reference/cmath/asinh.html
@@ -313,7 +313,7 @@ asinh(1.0)  = 0.881374
 </ul>
 <h2>実装例</h2>
 <p>以下のマクローリン級数を適当な次数で打ち切ることで近似的に求めることができる。</p>
-<p>$$ \mathrm{arsinh}~x = \sum_{n = 0}^{\infty} \frac{(-1)^n (2n)!}{4^n (n!)^2 (2n + 1)} x^{2n + 1} \quad \mathrm{for} \; |x| &lt; 1 $$</p>
+<p>$$ \mathrm{arsinh}~x = \sum_{n = 0}^{\infty} \frac{(-1)^n (2n)!}{4^n (n!)^2 (2n + 1)} x^{2n + 1} \quad \mathrm{for} \; |x| &amp;lt; 1 $$</p>
 <p>または対数に変換して求めることができる。</p>
 <p>$$ \mathrm{arsinh}~x = \log_e \left(x + \sqrt{x^2+1}\right) \quad \mathrm{for~all} \; x $$</p>
 <h2>参照</h2>
diff --git a/reference/cmath/atan.html b/reference/cmath/atan.html
index 4fca30fe2..72bdf2427 100644
--- a/reference/cmath/atan.html
+++ b/reference/cmath/atan.html
@@ -313,7 +313,7 @@ atan(∞)    = 1.570796
 </ul>
 <h2>実装例</h2>
 <p>以下のマクローリン級数を適当な次数で打ち切ることで近似的に求めることができる。</p>
-<p>$$ \mathrm{Arctan}~x = \sum_{n = 0}^{\infty} \frac{(-1)^n}{2n + 1} x^{2n + 1} \quad \mathrm{for} \; |x| &lt; 1 $$</p>
+<p>$$ \mathrm{Arctan}~x = \sum_{n = 0}^{\infty} \frac{(-1)^n}{2n + 1} x^{2n + 1} \quad \mathrm{for} \; |x| &amp;lt; 1 $$</p>
 <p>$ |x| \ge 1 $ の範囲、および $ |x| \rightarrow 1 $ 近傍の精度低下する領域においては、以下の公式による変換で求めることができる。</p>
 <p>(特に $ \sqrt{2} + 1 &lt; |x| $ の場合)</p>
 <p>$$ \mathrm{Arctan}~x = \frac{\pi}{2} - \mathrm{Arctan}~\frac{1}{x} \quad \mathrm{for} \; x &gt; 0 $$</p>
diff --git a/reference/cmath/atan2.html b/reference/cmath/atan2.html
index 248fe2134..c4446be28 100644
--- a/reference/cmath/atan2.html
+++ b/reference/cmath/atan2.html
@@ -353,9 +353,9 @@ atan2(-1.0, 1.0)  = -0.785398
 <p>$$
 \mathrm{Arctan}~\frac{y}{x} =
 \begin{cases}
-\displaystyle \mathrm{Arctan}~\frac{y}{x}       &amp; \quad \mathrm{for} \; 0 \le x \\[2ex]
-\displaystyle \mathrm{Arctan}~\frac{y}{x} + \pi &amp; \quad \mathrm{for} \; x &lt; 0, \; 0 \le y \\[2ex]
-\displaystyle \mathrm{Arctan}~\frac{y}{x} - \pi &amp; \quad \mathrm{for} \; x &lt; 0, \; y &lt; 0
+\displaystyle \mathrm{Arctan}~\frac{y}{x}       &amp;amp; \quad \mathrm{for} \; 0 \le x \\[2ex]
+\displaystyle \mathrm{Arctan}~\frac{y}{x} + \pi &amp;amp; \quad \mathrm{for} \; x &amp;lt; 0, \; 0 \le y \\[2ex]
+\displaystyle \mathrm{Arctan}~\frac{y}{x} - \pi &amp;amp; \quad \mathrm{for} \; x &amp;lt; 0, \; y &amp;lt; 0
 \end{cases}
 $$</p>
 <h2>参照</h2>
diff --git a/reference/cmath/atanh.html b/reference/cmath/atanh.html
index 553e7f436..775c165b4 100644
--- a/reference/cmath/atanh.html
+++ b/reference/cmath/atanh.html
@@ -320,9 +320,9 @@ atanh(1.0)  = inf
 </ul>
 <h2>実装例</h2>
 <p>以下のマクローリン級数を適当な次数で打ち切ることで近似的に求めることができる。</p>
-<p>$$ \mathrm{artanh}~x = \sum_{n = 0}^{\infty} \frac{1}{2n + 1} x^{2n + 1} \quad \mathrm{for} \; |x| &lt; 1 $$</p>
+<p>$$ \mathrm{artanh}~x = \sum_{n = 0}^{\infty} \frac{1}{2n + 1} x^{2n + 1} \quad \mathrm{for} \; |x| &amp;lt; 1 $$</p>
 <p>または対数に変換して求めることができる。</p>
-<p>$$ \mathrm{artanh}~x = \frac{1}{2} \log_e \frac{1 + x}{1 - x} \quad \mathrm{for} \; |x| &lt; 1 $$</p>
+<p>$$ \mathrm{artanh}~x = \frac{1}{2} \log_e \frac{1 + x}{1 - x} \quad \mathrm{for} \; |x| &amp;lt; 1 $$</p>
 <h2>参照</h2>
 <ul>
 <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1467r9.html" target="_blank">P1467R9 Extended floating-point types and standard names</a><ul>
diff --git a/reference/cmath/log.html b/reference/cmath/log.html
index e902f8f4b..9df319479 100644
--- a/reference/cmath/log.html
+++ b/reference/cmath/log.html
@@ -323,7 +323,7 @@ log(-1.0) = nan
 </ul>
 <h2>実装例</h2>
 <p>以下のマクローリン級数を適当な次数で打ち切ることで近似的に求めることができる。</p>
-<p>$$ \log_e (1 + x) = \sum_{n = 1}^{\infty} \frac{(-1)^{n + 1}}{n} x^n \quad \mathrm{for} \; -1 &lt; x \le 1 $$</p>
+<p>$$ \log_e (1 + x) = \sum_{n = 1}^{\infty} \frac{(-1)^{n + 1}}{n} x^n \quad \mathrm{for} \; -1 &amp;lt; x \le 1 $$</p>
 <h2>参照</h2>
 <ul>
 <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1467r9.html" target="_blank">P1467R9 Extended floating-point types and standard names</a><ul>
diff --git a/reference/cmath/riemann_zeta.html b/reference/cmath/riemann_zeta.html
index 2e34a1b83..8cf2c9e17 100644
--- a/reference/cmath/riemann_zeta.html
+++ b/reference/cmath/riemann_zeta.html
@@ -263,11 +263,11 @@
 $$
 \zeta (x) = \begin{cases}
   \displaystyle
-  \sum_{k=1}^\infty k^{-x} &amp; \text{for } x &gt; 1 \\
+  \sum_{k=1}^\infty k^{-x} &amp;amp; \text{for } x &gt; 1 \\
   \displaystyle
-  \frac{1}{1 - 2^{1-x}} \sum_{k=1}^\infty (-1)^{k-1} k^{-x} &amp; \text{for } 0 \le x \le 1 \\
+  \frac{1}{1 - 2^{1-x}} \sum_{k=1}^\infty (-1)^{k-1} k^{-x} &amp;amp; \text{for } 0 \le x \le 1 \\
   \displaystyle
-  2^x \pi^{x-1} \sin \frac{\pi x}{2} \Gamma (1 - x) \zeta(1 - x) &amp; \text{for } x &lt; 0
+  2^x \pi^{x-1} \sin \frac{\pi x}{2} \Gamma (1 - x) \zeta(1 - x) &amp;amp; \text{for } x &amp;lt; 0
 \end{cases}
 $$
 を返す。</p>
diff --git a/reference/cmath/tan.html b/reference/cmath/tan.html
index 2428609d3..08a8a0370 100644
--- a/reference/cmath/tan.html
+++ b/reference/cmath/tan.html
@@ -320,7 +320,7 @@ tan(pi/2) = 16331239353195370.000000
 </ul>
 <h2>実装例</h2>
 <p><code>tan</code> のマクローリン展開はベルヌーイ数が登場するため計算には向かない。</p>
-<p>$$ \tan x = \sum_{n = 1}^{\infty} \frac{B_{2n}(-4)^n(1-4^n)}{(2n)!} x^{2n - 1} \quad \mathrm{for} \; |x| &lt; \frac{\pi}{2} $$</p>
+<p>$$ \tan x = \sum_{n = 1}^{\infty} \frac{B_{2n}(-4)^n(1-4^n)}{(2n)!} x^{2n - 1} \quad \mathrm{for} \; |x| &amp;lt; \frac{\pi}{2} $$</p>
 <p>以下の公式から求めることができる。</p>
 <p>$$ \tan x = \frac{\sin x}{\cos x} $$</p>
 <h2>参照</h2>
diff --git a/reference/cmath/tanh.html b/reference/cmath/tanh.html
index b7ea50271..9583c8add 100644
--- a/reference/cmath/tanh.html
+++ b/reference/cmath/tanh.html
@@ -315,7 +315,7 @@ tanh(1.0)  = 0.761594
 </ul>
 <h2>実装例</h2>
 <p><code>tanh</code> のマクローリン展開はベルヌーイ数が登場するため計算には向かない。</p>
-<p>$$ \tanh x = \sum_{n = 1}^{\infty} \frac{B_{2n}4^n(4^n - 1)}{(2n)!} x^{2n - 1} \quad \mathrm{for} \; |x| &lt; \frac{\pi}{2} $$</p>
+<p>$$ \tanh x = \sum_{n = 1}^{\infty} \frac{B_{2n}4^n(4^n - 1)}{(2n)!} x^{2n - 1} \quad \mathrm{for} \; |x| &amp;lt; \frac{\pi}{2} $$</p>
 <p>以下の公式から求めることができる。</p>
 <p>$$ \tanh x = \frac{\sinh x}{\cosh x} $$</p>
 <h2>参照</h2>
diff --git a/reference/numeric/gcd.html b/reference/numeric/gcd.html
index 7fc4453aa..6f74980f7 100644
--- a/reference/numeric/gcd.html
+++ b/reference/numeric/gcd.html
@@ -371,8 +371,8 @@ gcd&lt;uint32_t, uint32_t&gt;(-2147483648, -2147483648) 2147483648
 </ul>
 <h2>実装例</h2>
 <p>$$ \mathrm{gcd}(m, n) = \begin{cases}
-  |m| &amp; \text{if } n = 0 \\
-  \mathrm{gcd}(n, m \bmod n) &amp; \text{otherwise}
+  |m| &amp;amp; \text{if } n = 0 \\
+  \mathrm{gcd}(n, m \bmod n) &amp;amp; \text{otherwise}
 \end{cases} $$</p></div>
 
       </div>
diff --git a/start_editing/markdown_cpprefjp.html b/start_editing/markdown_cpprefjp.html
index 5f8f08d8a..1a4ea000e 100644
--- a/start_editing/markdown_cpprefjp.html
+++ b/start_editing/markdown_cpprefjp.html
@@ -496,8 +496,8 @@ int main() {
 <p><pre><code>$$
 \left\{
 \begin{array}{ll}
-p \log_{10}b&amp;\text{もし $b$ が $10$ の累乗の場合}\\
-\lfloor (p - 1) \log_{10} b\rfloor&amp;\text{上記以外の場合}\\
+p \log_{10}b&amp;amp;\text{もし $b$ が $10$ の累乗の場合}\\
+\lfloor (p - 1) \log_{10} b\rfloor&amp;amp;\text{上記以外の場合}\\
 \end{array}
 \right.
 $$
@@ -506,8 +506,8 @@ $$
 $$
 \left\{
 \begin{array}{ll}
-p \log_{10}b&amp;\text{もし $b$ が $10$ の累乗の場合}\\
-\lfloor (p - 1) \log_{10} b\rfloor&amp;\text{上記以外の場合}\\
+p \log_{10}b&amp;amp;\text{もし $b$ が $10$ の累乗の場合}\\
+\lfloor (p - 1) \log_{10} b\rfloor&amp;amp;\text{上記以外の場合}\\
 \end{array}
 \right.
 $$</p></div>

これは記事ソースの方で &amp; としているのを & にすれば問題ありません。その方が自然に記述できるので望ましい変化のように思います。

&amp; となるべき所が単に & になっていたのが正しく &amp; になる

これは今回の修正の対応であり意図した出力結果の変化です。

diff --git a/reference/memory/addressof.html b/reference/memory/addressof.html
index 3f1c1a472..e92c6b913 100644
--- a/reference/memory/addressof.html
+++ b/reference/memory/addressof.html
@@ -259,7 +259,7 @@
   <span class="p">{</span>
     <span class="n">nonaddressable</span> <span class="n">x</span><span class="p">;</span>
     <span class="n">nonaddressable</span><span class="o">*</span> <span class="n">p1</span> <span class="o">=</span> <span class="n"><span style="color:#ff0000">std::addressof</span></span><span class="p">(</span><span class="n">x</span><span class="p">);</span> <span class="c1">// OK : アドレス取得できる</span>
-<span class="c1">//  nonaddressable* p2 = &x; // エラー!アドレス取得できない</span>
+<span class="c1">//  nonaddressable* p2 = &amp;x; // エラー!アドレス取得できない</span>
   <span class="p">}</span>
 <span class="p">}</span>
 </code></pre></div>
diff --git a/reference/memory_resource/monotonic_buffer_resource/do_is_equal.html b/reference/memory_resource/monotonic_buffer_resource/do_is_equal.html
index a72414bda..349cdb6dd 100644
--- a/reference/memory_resource/monotonic_buffer_resource/do_is_equal.html
+++ b/reference/memory_resource/monotonic_buffer_resource/do_is_equal.html
@@ -233,7 +233,7 @@
 <h2>引数</h2>
 <p><code>other</code> -- 任意の<code>memory_resource</code>オブジェクト</p>
 <h2>戻り値</h2>
-<p><code>return this == &other;</code></p>
+<p><code>return this == &amp;other;</code></p>
 <h2>例外</h2>
 <p>投げない。</p>
 <h2>バージョン</h2>
diff --git a/reference/memory_resource/pool_resource/do_is_equal.html b/reference/memory_resource/pool_resource/do_is_equal.html
index e499c4280..a24a780c1 100644
--- a/reference/memory_resource/pool_resource/do_is_equal.html
+++ b/reference/memory_resource/pool_resource/do_is_equal.html
@@ -233,7 +233,7 @@
 <h2>引数</h2>
 <p><code>other</code> -- 任意の<code>memory_resource</code>オブジェクト</p>
 <h2>戻り値</h2>
-<p><code>return this == &other;</code></p>
+<p><code>return this == &amp;other;</code></p>
 <h2>例外</h2>
 <p>投げない。</p>
 <h2>バージョン</h2>
diff --git a/start_editing/markdown_cpprefjp.html b/start_editing/markdown_cpprefjp.html
index 5f8f08d8a..1a4ea000e 100644
--- a/start_editing/markdown_cpprefjp.html
+++ b/start_editing/markdown_cpprefjp.html
@@ -250,5 +250,5 @@ comment out text...
 <p>これなら正しく表示されます。</p>
 <h3>HTMLエンティティを使用できない制限</h3>
-<p><pre><code>&reg;
+<p><pre><code>&amp;reg;
 </code></pre></p>
 <p>上記のような書き方をすると、cpprefjpではエラーになります。HTML エンティティを使わず、以下のように書いてください。</p>

&amp;#x7C; のように overescape していたのが不要に

この記述は &#x7C; としても数値文字参照として処理されてしまうのを避けるために敢えて &amp;#x7C; としていたのだと思うので、今回の修正によってわざわざそのように記述しなくて良くなったということで、これも記事ソースの方を修正するのが妥当だろうと思います。

diff --git a/start_editing/markdown_cpprefjp.html b/start_editing/markdown_cpprefjp.html
index 5f8f08d8a..1a4ea000e 100644
--- a/start_editing/markdown_cpprefjp.html
+++ b/start_editing/markdown_cpprefjp.html
@@ -237,7 +237,7 @@ comment out text...
 --&gt;
 </code></pre></p>
 <h3>表内での縦線の制限</h3>
-<p>表内で <code>|</code> (縦線、vertical line) を使用するために、文字参照 <code>&amp;#x7C;</code> を使用しています。</p>
+<p>表内で <code>|</code> (縦線、vertical line) を使用するために、文字参照 <code>&amp;amp;#x7C;</code> を使用しています。</p>
 <h3>箇条書きのインデントとして4スペースのみを許可する制限</h3>
 <p>実装に使用しているMarkdownパーサーによる制限で、箇条書きのインデントとして4スペースのみを許可しています (2スペースでは正しくインデントされません)。</p>
 <p><pre><code>* てすと

これまでは self._markdown.serializer が使われていたが、serializer は何
故か実体参照のパターンに一致する & を &amp; に変換せずにそのまま出力す
る仕様になっている [1]。これを用いてHTMLに戻すと例えば元々のHTMLソース
で &amp;var; となっていたものが処理後のHTMLソースで不正な実体参照
&var; になってしまい、ブラウザで正しく表示されなくなる可能性がある。例
えば reference/memory/addressof.html でこれが起こっている [2]。さらに、
後段でHTMLを解釈して処理しようとしたときにクラッシュする。

xml.etree.ElementTree が etree.tostring(method="xml") で正当なHTMLへの
変換に対応しているが、これを用いると <td></td> などが <td /> になって
しまう。代わりに method="html" を使うと <br /> などが <br> になってし
まう。また、どちらの method の場合でも HTML 属性の順序が変わってしまう
ので好ましくない。

この実装では代わりに markdown.searializers の内部変数
markdown.searializers.RE_AMP を書き換えることによって期待する動作を得
ている。上流の markdown.searializers で実装の変更があると動かなくなる
可能性があることに注意する。

[1] https://github.com/Python-Markdown/markdown/blob/a11431539d08e14b0bd821ceb101fa59d6a74c8a/markdown/serializers.py#L69-L70
[2] https://github.com/cpprefjp/cpprefjp.github.io/blob/335489b522dcbb648c19a49e39cc880e187911a5/reference/memory/addressof.html#L263
@akinomyoga
Copy link
Member Author

改めて etree.tostring(element, encoding="unicode", method="xml")etree.tostring(element, encoding="unicode", method="xml") を用いる方法を試してみましたが、前者は <td></td><td /> になる問題があり、後者は <br /><br> になる問題があるのが好ましくない理由でした。また HTML 属性の順序がランダムになる問題もあります。

commit 内容と commit メッセージを更新しました。

@akinomyoga
Copy link
Member Author

site, site_generator に対する修正は以下にあります。この PR + これらの変更の組み合わせでサイト全体の HTML 出力結果が意図したもの以外は変わっていないことを確認しました。

現在の HTML 出力結果の変化は (最終更新日時&最終更新者を除き) 以下の通りです:

diff --git a/reference/memory/addressof.html b/reference/memory/addressof.html
index 3f1c1a472..e92c6b913 100644
--- a/reference/memory/addressof.html
+++ b/reference/memory/addressof.html
@@ -259,7 +259,7 @@
   <span class="p">{</span>
     <span class="n">nonaddressable</span> <span class="n">x</span><span class="p">;</span>
     <span class="n">nonaddressable</span><span class="o">*</span> <span class="n">p1</span> <span class="o">=</span> <span class="n"><span style="color:#ff0000">std::addressof</span></span><span class="p">(</span><span class="n">x</span>>
-<span class="c1">//  nonaddressable* p2 = &x; // エラー!アドレス取得できない</span>
+<span class="c1">//  nonaddressable* p2 = &amp;x; // エラー!アドレス取得できない</span>
   <span class="p">}</span>
 <span class="p">}</span>
 </code></pre></div>
diff --git a/reference/memory_resource/monotonic_buffer_resource/do_is_equal.html b/reference/memory_resource/monotonic_buffer_resource/do_is_equal.html
index a72414bda..349cdb6dd 100644
--- a/reference/memory_resource/monotonic_buffer_resource/do_is_equal.html
+++ b/reference/memory_resource/monotonic_buffer_resource/do_is_equal.html
@@ -233,7 +233,7 @@
 <h2>引数</h2>
 <p><code>other</code> -- 任意の<code>memory_resource</code>オブジェクト</p>
 <h2>戻り値</h2>
-<p><code>return this == &other;</code></p>
+<p><code>return this == &amp;other;</code></p>
 <h2>例外</h2>
 <p>投げない。</p>
 <h2>バージョン</h2>
diff --git a/reference/memory_resource/pool_resource/do_is_equal.html b/reference/memory_resource/pool_resource/do_is_equal.html
index e499c4280..a24a780c1 100644
--- a/reference/memory_resource/pool_resource/do_is_equal.html
+++ b/reference/memory_resource/pool_resource/do_is_equal.html
@@ -233,7 +233,7 @@
 <h2>引数</h2>
 <p><code>other</code> -- 任意の<code>memory_resource</code>オブジェクト</p>
 <h2>戻り値</h2>
-<p><code>return this == &other;</code></p>
+<p><code>return this == &amp;other;</code></p>
 <h2>例外</h2>
 <p>投げない。</p>
 <h2>バージョン</h2>
diff --git a/start_editing/markdown_cpprefjp.html b/start_editing/markdown_cpprefjp.html
index 7d29bd71f..f49ebc926 100644
--- a/start_editing/markdown_cpprefjp.html
+++ b/start_editing/markdown_cpprefjp.html
@@ -249,7 +249,7 @@ comment out text...
 </code></pre></p>
 <p>これなら正しく表示されます。</p>
 <h3>HTMLエンティティを使用できない制限</h3>
-<p><pre><code>&reg;
+<p><pre><code>&amp;reg;
 </code></pre></p>
 <p>上記のような書き方をすると、cpprefjpではエラーになります。HTML エンティティを使わず、以下のように書いてください。</p>
 <p><pre><code>®

@akinomyoga akinomyoga marked this pull request as ready for review November 20, 2024 12:33
@akinomyoga akinomyoga changed the title [WIP] html_attribute: HTMLエンティティーが破壊される問題を修正 html_attribute: HTMLエンティティーが破壊される問題を修正 Nov 20, 2024
akinomyoga added a commit to akinomyoga/cpprefjp-site that referenced this pull request Nov 20, 2024
akinomyoga added a commit to akinomyoga/cpprefjp-site_generator that referenced this pull request Nov 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants