docchecker
84 lines
| 1.9 KiB
| text/plain
|
TextLexer
/ doc / docchecker
Gregory Szorc
|
r46434 | #!/usr/bin/env python3 | ||
timeless
|
r27730 | # | ||
# docchecker - look for problematic markup | ||||
# | ||||
# Copyright 2016 timeless <timeless@mozdev.org> and others | ||||
# | ||||
# This software may be used and distributed according to the terms of the | ||||
# GNU General Public License version 2 or any later version. | ||||
Pulkit Goyal
|
r29168 | |||
Pulkit Goyal
|
r29169 | from __future__ import absolute_import, print_function | ||
Pulkit Goyal
|
r29168 | |||
Matt Harbison
|
r41042 | import os | ||
Pulkit Goyal
|
r29168 | import re | ||
timeless
|
r27730 | import sys | ||
Matt Harbison
|
r41042 | try: | ||
import msvcrt | ||||
Gregory Szorc
|
r44089 | |||
Matt Harbison
|
r41042 | msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) | ||
msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY) | ||||
except ImportError: | ||||
pass | ||||
stdout = getattr(sys.stdout, 'buffer', sys.stdout) | ||||
leadingline = re.compile(br'(^\s*)(\S.*)$') | ||||
timeless
|
r28810 | |||
checks = [ | ||||
Gregory Szorc
|
r44089 | ( | ||
br""":hg:`[^`]*'[^`]*`""", | ||||
b"""warning: please avoid nesting ' in :hg:`...`""", | ||||
), | ||||
(br'\w:hg:`', b'warning: please have a space before :hg:'), | ||||
( | ||||
br"""(?:[^a-z][^'.])hg ([^,;"`]*'(?!hg)){2}""", | ||||
b'''warning: please use " instead of ' for hg ... "..."''', | ||||
), | ||||
timeless
|
r28810 | ] | ||
timeless
|
r27730 | |||
Gregory Szorc
|
r44089 | |||
timeless
|
r27730 | def check(line): | ||
timeless
|
r28810 | messages = [] | ||
for match, msg in checks: | ||||
if re.search(match, line): | ||||
messages.append(msg) | ||||
if messages: | ||||
Matt Harbison
|
r41042 | stdout.write(b'%s\n' % line) | ||
timeless
|
r28810 | for msg in messages: | ||
Matt Harbison
|
r41042 | stdout.write(b'%s\n' % msg) | ||
timeless
|
r27730 | |||
Gregory Szorc
|
r44089 | |||
timeless
|
r27730 | def work(file): | ||
Matt Harbison
|
r41042 | (llead, lline) = (b'', b'') | ||
timeless
|
r27730 | |||
FUJIWARA Katsunori
|
r28049 | for line in file: | ||
# this section unwraps lines | ||||
match = leadingline.match(line) | ||||
if not match: | ||||
check(lline) | ||||
Matt Harbison
|
r41042 | (llead, lline) = (b'', b'') | ||
FUJIWARA Katsunori
|
r28049 | continue | ||
timeless
|
r27730 | |||
FUJIWARA Katsunori
|
r28049 | lead, line = match.group(1), match.group(2) | ||
Gregory Szorc
|
r44089 | if lead == llead: | ||
if lline != b'': | ||||
Matt Harbison
|
r41042 | lline += b' ' + line | ||
FUJIWARA Katsunori
|
r28049 | else: | ||
lline = line | ||||
else: | ||||
check(lline) | ||||
(llead, lline) = (lead, line) | ||||
check(lline) | ||||
timeless
|
r27730 | |||
Gregory Szorc
|
r44089 | |||
timeless
|
r27730 | def main(): | ||
FUJIWARA Katsunori
|
r28049 | for f in sys.argv[1:]: | ||
try: | ||||
Matt Harbison
|
r41042 | with open(f, 'rb') as file: | ||
FUJIWARA Katsunori
|
r28049 | work(file) | ||
except BaseException as e: | ||||
Matt Harbison
|
r41042 | sys.stdout.write(r"failed to process %s: %s\n" % (f, e)) | ||
timeless
|
r27730 | |||
Gregory Szorc
|
r44089 | |||
timeless
|
r27730 | main() | ||