2016-07-12 12:11:18 +00:00
|
|
|
#!/usr/bin/env python
|
2018-10-06 16:23:54 +00:00
|
|
|
|
2016-07-19 19:25:46 +00:00
|
|
|
# Build the gh-pages
|
2016-07-12 12:11:18 +00:00
|
|
|
|
2019-06-23 19:57:37 +00:00
|
|
|
from collections import OrderedDict
|
2016-07-12 12:11:18 +00:00
|
|
|
import re
|
2016-07-19 19:25:46 +00:00
|
|
|
import sys
|
2016-08-06 08:40:35 +00:00
|
|
|
import json
|
2016-07-19 19:25:46 +00:00
|
|
|
|
2016-08-06 08:40:35 +00:00
|
|
|
from lintlib import parse_all, log
|
2016-07-12 12:11:18 +00:00
|
|
|
|
2016-07-15 11:08:04 +00:00
|
|
|
lint_subheadline = re.compile(r'''^\*\*([\w\s]+?)[:?.!]?\*\*(.*)''')
|
2019-08-18 16:04:18 +00:00
|
|
|
rust_code_block = re.compile(r'''```rust.+?```''', flags=re.DOTALL)
|
2016-07-15 11:08:04 +00:00
|
|
|
|
2016-08-06 08:40:35 +00:00
|
|
|
CONF_TEMPLATE = """\
|
2016-07-15 11:08:04 +00:00
|
|
|
This lint has the following configuration variables:
|
|
|
|
|
2016-08-06 08:40:35 +00:00
|
|
|
* `%s: %s`: %s (defaults to `%s`)."""
|
2016-07-15 11:08:04 +00:00
|
|
|
|
|
|
|
|
2019-08-18 16:04:18 +00:00
|
|
|
def parse_code_block(match):
|
|
|
|
lines = []
|
|
|
|
|
|
|
|
for line in match.group(0).split('\n'):
|
2021-01-30 17:06:34 +00:00
|
|
|
# fix syntax highlighting for headers like ```rust,ignore
|
|
|
|
if line.startswith('```rust'):
|
|
|
|
lines.append('```rust')
|
|
|
|
elif not line.startswith('# '):
|
2019-08-18 16:04:18 +00:00
|
|
|
lines.append(line)
|
|
|
|
|
|
|
|
return '\n'.join(lines)
|
|
|
|
|
|
|
|
|
2016-08-06 08:40:35 +00:00
|
|
|
def parse_lint_def(lint):
|
|
|
|
lint_dict = {}
|
|
|
|
lint_dict['id'] = lint.name
|
2018-04-10 10:23:41 +00:00
|
|
|
lint_dict['group'] = lint.group
|
2016-08-06 08:40:35 +00:00
|
|
|
lint_dict['level'] = lint.level
|
2019-06-23 19:57:37 +00:00
|
|
|
lint_dict['docs'] = OrderedDict()
|
2016-07-12 12:11:18 +00:00
|
|
|
|
|
|
|
last_section = None
|
|
|
|
|
2016-08-06 08:40:35 +00:00
|
|
|
for line in lint.doc:
|
2016-07-12 12:11:18 +00:00
|
|
|
match = re.match(lint_subheadline, line)
|
|
|
|
if match:
|
|
|
|
last_section = match.groups()[0]
|
2016-07-14 19:00:20 +00:00
|
|
|
text = match.groups()[1]
|
|
|
|
else:
|
|
|
|
text = line
|
|
|
|
|
2016-07-12 12:11:18 +00:00
|
|
|
if not last_section:
|
2019-06-23 19:57:37 +00:00
|
|
|
log.warning("Skipping comment line as it was not preceded by a heading")
|
2016-08-06 08:40:35 +00:00
|
|
|
log.debug("in lint `%s`, line `%s`", lint.name, line)
|
|
|
|
|
2019-06-23 19:57:37 +00:00
|
|
|
if last_section not in lint_dict['docs']:
|
|
|
|
lint_dict['docs'][last_section] = ""
|
|
|
|
|
|
|
|
lint_dict['docs'][last_section] += text + "\n"
|
2018-02-01 22:04:59 +00:00
|
|
|
|
2019-06-23 19:57:37 +00:00
|
|
|
for section in lint_dict['docs']:
|
2019-08-18 16:04:18 +00:00
|
|
|
lint_dict['docs'][section] = re.sub(rust_code_block, parse_code_block, lint_dict['docs'][section].strip())
|
2016-08-06 08:40:35 +00:00
|
|
|
|
|
|
|
return lint_dict
|
2016-07-12 12:11:18 +00:00
|
|
|
|
2016-07-19 19:25:46 +00:00
|
|
|
|
2016-07-12 12:11:18 +00:00
|
|
|
def main():
|
2016-08-06 08:40:35 +00:00
|
|
|
lintlist, configs = parse_all()
|
|
|
|
lints = {}
|
|
|
|
for lint in lintlist:
|
|
|
|
lints[lint.name] = parse_lint_def(lint)
|
|
|
|
if lint.name in configs:
|
|
|
|
lints[lint.name]['docs']['Configuration'] = \
|
|
|
|
CONF_TEMPLATE % configs[lint.name]
|
|
|
|
|
|
|
|
outfile = sys.argv[1] if len(sys.argv) > 1 else "util/gh-pages/lints.json"
|
|
|
|
with open(outfile, "w") as fp:
|
2020-01-24 13:34:25 +00:00
|
|
|
lints = list(lints.values())
|
|
|
|
lints.sort(key=lambda x: x['id'])
|
|
|
|
json.dump(lints, fp, indent=2)
|
2016-08-06 08:40:35 +00:00
|
|
|
log.info("wrote JSON for great justice")
|
2016-07-19 19:25:46 +00:00
|
|
|
|
2016-07-12 12:11:18 +00:00
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2016-07-14 19:00:20 +00:00
|
|
|
main()
|