42 lines
1.3 KiB
Python
42 lines
1.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
import io, re, sys
|
|
|
|
def find_oj_section(html, start):
|
|
n = len(html)
|
|
depth = 1
|
|
i = start + len('<div class="oj-section"')
|
|
while depth > 0 and i < n:
|
|
o = html.find('<div', i)
|
|
c = html.find('</div>', i)
|
|
if c == -1:
|
|
return -1
|
|
if o != -1 and o < c:
|
|
depth += 1
|
|
i = o + 4
|
|
else:
|
|
depth -= 1
|
|
i = c + 6
|
|
return i
|
|
|
|
for f in sys.argv[1:]:
|
|
c = io.open(f, encoding='utf-8').read()
|
|
pat = re.compile(r'<div class="oj-section" data-oj-section="([^"]+)">')
|
|
print('===', f.replace('\\', '/').split('/')[-1])
|
|
total_panels = 0
|
|
bad = []
|
|
for m in pat.finditer(c):
|
|
name = m.group(1)
|
|
end = find_oj_section(c, m.start())
|
|
blk = c[m.start():end]
|
|
expl = blk.count('class="oj-explains"')
|
|
panels = blk.count('class="prob-detail"')
|
|
total_panels += panels
|
|
if expl != 1 or panels != 5:
|
|
bad.append('%s: expl=%d panels=%d' % (name, expl, panels))
|
|
print(' oj-sections:', c.count('data-oj-section='), '| total prob-detail:', total_panels)
|
|
if bad:
|
|
print(' MISMATCH blocks:', bad)
|
|
else:
|
|
print(' OK: every student has exactly 1 题目讲解 block with 5 panels')
|
|
print(' div balance:', c.count('<div'), '/', c.count('</div>'))
|