rust/util/export.py

85 lines
2.2 KiB
Python
Raw Normal View History

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