pythonでCGIプログラムを書くと、str型(文字列型)の変数にテンプレートとなるHTMLを代入して可変のところだけ文字列フォーマット化してしまうことが多いが、python3から本格導入されたformatメソッドでは書式指定部分が「%」から「{}」に囲まれてた部分に変更されているので、HTML中のCSSやJavaScirptと非常に相性が悪い。({ }の間で改行してもKeyとして認識されてしまう)
「%」のときと同様に同じ文字を重ねたらエスケープできるが(「{」→「{{」)、これをHTMLテンプレートの中で全部すると非常にめんどくさいし可読性も悪くなる。
なので、人がコードを記載するときのクセの違いを利用して、後から「{」を「{{」に置換してしまおうという作戦。
大抵の人が以下のようなクセになると思う。(完全に私感)
pythonのformatによる書式指定({}の間はスペースを空けない)
'<html><body>{body}</body></html>'.format(body="今日は晴天なり")
CSS/Javascript(可読性をあげるために{}の間に改行やスペースが入る)
<html>
<head>
<style type="text/css">
<!--
dt{ backgroud: #bbb }
.odd{ backgroud: #ddd }
-->
</style>
<script type="text/javascript">
function hogehoge() {
print("本日は晴天なり");
}
</script>
</head>
これを踏まえて以下のようにすれば、HTMLテンプレート部分は毎度エスケープしなくてもよくなる。({}を重ねる置換を実施してからformatをしている)
import re
htmltemplate='''
HTMLのテンプレート
'''
html=re.sub(r'([^a-zA-Z0-9])}',r'\1}}',re.sub(r'{([^a-zA-Z0-9])',r'{{\1',htmltemplate,0,re.M|re.S),0,re.M|re.S).format(書式指定)
