-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'feature/gh-pages-docs' of https://github.com/killercup/…
…rust-clippy into killercup-feature/gh-pages-docs
- Loading branch information
Showing
5 changed files
with
329 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# EditorConfig helps developers define and maintain consistent | ||
# coding styles between different editors and IDEs | ||
# editorconfig.org | ||
|
||
root = true | ||
|
||
[*] | ||
end_of_line = lf | ||
charset = utf-8 | ||
trim_trailing_whitespace = true | ||
insert_final_newline = true | ||
indent_style = space | ||
indent_size = 4 | ||
|
||
[*.md] | ||
trim_trailing_whitespace = false |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,3 +16,6 @@ Cargo.lock | |
|
||
# Generated by dogfood | ||
/target_recur/ | ||
|
||
# gh pages docs | ||
util/gh-pages/lints.json |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
#!/usr/bin/env python | ||
|
||
import os | ||
import re | ||
import json | ||
|
||
level_re = re.compile(r'''(Forbid|Deny|Warn|Allow)''') | ||
conf_re = re.compile(r'''define_Conf! {\n([^}]*)\n}''', re.MULTILINE) | ||
confvar_re = re.compile(r'''/// Lint: (\w+). (.*).*\n *\("([^"]*)", (?:[^,]*), (.*) => (.*)\),''') | ||
lint_subheadline = re.compile(r'''^\*\*([\w\s]+?)[:?.!]?\*\*(.*)''') | ||
|
||
conf_template = """ | ||
This lint has the following configuration variables: | ||
* `%s: %s`: %s (defaults to `%s`). | ||
""" | ||
|
||
# TODO: actual logging | ||
def warn(*args): print(args) | ||
def debug(*args): print(args) | ||
def info(*args): print(args) | ||
|
||
def parse_path(p="clippy_lints/src"): | ||
lints = [] | ||
for f in os.listdir(p): | ||
if f.endswith(".rs"): | ||
parse_file(lints, os.path.join(p, f)) | ||
|
||
conf = parse_conf(p) | ||
info(conf) | ||
|
||
for lint_id in conf: | ||
lint = next(l for l in lints if l['id'] == lint_id) | ||
if lint: | ||
lint['docs']['Configuration'] = (conf_template % conf[lint_id]).strip() | ||
|
||
return lints | ||
|
||
|
||
def parse_conf(p): | ||
c = {} | ||
with open(p + '/utils/conf.rs') as f: | ||
f = f.read() | ||
|
||
m = re.search(conf_re, f) | ||
m = m.groups()[0] | ||
|
||
m = re.findall(confvar_re, m) | ||
|
||
for (lint, doc, name, default, ty) in m: | ||
c[lint.lower()] = (name, ty, doc, default) | ||
|
||
return c | ||
|
||
def parseLintDef(level, comment, name): | ||
lint = {} | ||
lint['id'] = name | ||
lint['level'] = level | ||
lint['docs'] = {} | ||
|
||
last_section = None | ||
|
||
for line in comment: | ||
if len(line.strip()) == 0: | ||
continue | ||
|
||
match = re.match(lint_subheadline, line) | ||
if match: | ||
last_section = match.groups()[0] | ||
if match: | ||
text = match.groups()[1] | ||
else: | ||
text = line | ||
|
||
if not last_section: | ||
warn("Skipping comment line as it was not preceded by a heading") | ||
debug("in lint `%s`, line `%s`" % name, line) | ||
|
||
lint['docs'][last_section] = (lint['docs'].get(last_section, "") + "\n" + text).strip() | ||
|
||
return lint | ||
|
||
def parse_file(d, f): | ||
last_comment = [] | ||
comment = True | ||
|
||
with open(f) as rs: | ||
for line in rs: | ||
if comment: | ||
if line.startswith("///"): | ||
if line.startswith("/// "): | ||
last_comment.append(line[4:]) | ||
else: | ||
last_comment.append(line[3:]) | ||
elif line.startswith("declare_lint!"): | ||
comment = False | ||
deprecated = False | ||
restriction = False | ||
elif line.startswith("declare_restriction_lint!"): | ||
comment = False | ||
deprecated = False | ||
restriction = True | ||
elif line.startswith("declare_deprecated_lint!"): | ||
comment = False | ||
deprecated = True | ||
else: | ||
last_comment = [] | ||
if not comment: | ||
l = line.strip() | ||
m = re.search(r"pub\s+([A-Z_][A-Z_0-9]*)", l) | ||
|
||
if m: | ||
name = m.group(1).lower() | ||
|
||
# Intentionally either a never looping or infinite loop | ||
while not deprecated and not restriction: | ||
m = re.search(level_re, line) | ||
if m: | ||
level = m.group(0) | ||
break | ||
|
||
line = next(rs) | ||
|
||
if deprecated: | ||
level = "Deprecated" | ||
elif restriction: | ||
level = "Allow" | ||
|
||
info("found %s with level %s in %s" % (name, level, f)) | ||
d.append(parseLintDef(level, last_comment, name=name)) | ||
last_comment = [] | ||
comment = True | ||
if "}" in l: | ||
warn("Warning: Missing Lint-Name in", f) | ||
comment = True | ||
|
||
def main(): | ||
lints = parse_path() | ||
info("got %s lints" % len(lints)) | ||
with open("util/gh-pages/lints.json", "w") as file: | ||
json.dump(lints, file, indent=2) | ||
info("wrote JSON for great justice") | ||
|
||
if __name__ == "__main__": | ||
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,157 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="UTF-8"/> | ||
<meta name="viewport" content="width=device-width, initial-scale=1"/> | ||
|
||
<title>Clippy</title> | ||
|
||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css"/> | ||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.5.0/styles/github.min.css"/> | ||
<style> | ||
blockquote { font-size: 1em; } | ||
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak { display: none !important; } | ||
.panel .anchor { display: none; } | ||
.panel:hover .anchor { display: inline; color: #fff; } | ||
</style> | ||
</head> | ||
<body> | ||
<div class="container" ng-app="clippy" ng-controller="lintList"> | ||
<div class="page-header"> | ||
<h1>ALL the Clippy Lints</h1> | ||
</div> | ||
|
||
<noscript> | ||
<div class="alert alert-danger" role="alert"> | ||
Sorry, this site only works with JavaScript! | ||
</div> | ||
</noscript> | ||
|
||
<div ng-cloak> | ||
|
||
<div class="alert alert-info" role="alert" ng-if="loading"> | ||
Loading… | ||
</div> | ||
<div class="alert alert-danger" role="alert" ng-if="error"> | ||
Error loading lints! | ||
</div> | ||
|
||
<div class="panel panel-default" ng-show="data"> | ||
<div class="panel-body row"> | ||
<div class="col-md-6 form-inline"> | ||
<div class="form-group form-group-lg"> | ||
<div class="checkbox" ng-repeat="(level, enabled) in levels" style="margin-right: 0.6em"> | ||
<label> | ||
<input type="checkbox" ng-model="levels[level]" /> | ||
{{level}} | ||
</label> | ||
</div> | ||
</div> | ||
</div> | ||
<div class="col-md-6"> | ||
<div class="input-group"> | ||
<span class="input-group-addon" id="filter-label">Filter:</span> | ||
<input type="text" class="form-control" placeholder="Keywords or search string" aria-describedby="filter-label" ng-model="search" /> | ||
<span class="input-group-btn"> | ||
<button class="btn btn-default" type="button" ng-click="search = ''"> | ||
Clear | ||
</button> | ||
</span> | ||
</div> | ||
</div> | ||
</div> | ||
</div> | ||
|
||
<article class="panel panel-default" id="{{lint.id}}" ng-repeat="lint in data | filter:byLevels | filter:search | orderBy:'id' track by lint.id"> | ||
<header class="panel-heading" ng-click="open[lint.id] = !open[lint.id]"> | ||
<button class="btn btn-default btn-sm pull-right" style="margin-top: -6px;"> | ||
<span ng-show="open[lint.id]">−</span> | ||
<span ng-hide="open[lint.id]">+</span> | ||
</button> | ||
|
||
<h2 class="panel-title"> | ||
{{lint.id}} | ||
|
||
<span ng-if="lint.level == 'Allow'" class="label label-info">Allow</span> | ||
<span ng-if="lint.level == 'Warn'" class="label label-warning">Warn</span> | ||
<span ng-if="lint.level == 'Deny'" class="label label-danger">Deny</span> | ||
<span ng-if="lint.level == 'Deprecated'" class="label label-default">Deprecated</span> | ||
|
||
<a href="#{{lint.id}}" class="anchor label label-default">¶</a> | ||
</h2> | ||
</header> | ||
|
||
<ul class="list-group" ng-if="lint.docs" ng-class="{collapse: true, in: open[lint.id]}"> | ||
<li class="list-group-item" ng-repeat="(title, text) in lint.docs"> | ||
<h4 class="list-group-item-heading"> | ||
{{title}} | ||
</h4> | ||
<div class="list-group-item-text" ng-bind-html="text | markdown"></div> | ||
</li> | ||
</ul> | ||
</article> | ||
</div> | ||
</div> | ||
|
||
<a href="https://github.com/Manishearth/rust-clippy"> | ||
<img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"/> | ||
</a> | ||
|
||
<script src="https://cdnjs.cloudflare.com/ajax/libs/markdown-it/7.0.0/markdown-it.min.js"></script> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.5.0/highlight.min.js"></script> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.5.0/languages/rust.min.js"></script> | ||
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.12/angular.min.js"></script> | ||
<script> | ||
(function () { | ||
var md = window.markdownit({ | ||
html: true, | ||
linkify: true, | ||
typographer: true, | ||
highlight: function (str, lang) { | ||
if (lang && hljs.getLanguage(lang)) { | ||
try { | ||
return '<pre class="hljs"><code>' + | ||
hljs.highlight(lang, str, true).value + | ||
'</code></pre>'; | ||
} catch (__) {} | ||
} | ||
|
||
return '<pre class="hljs"><code>' + md.utils.escapeHtml(str) + '</code></pre>'; | ||
} | ||
}); | ||
|
||
angular.module("clippy", []) | ||
.filter('markdown', function ($sce) { | ||
return function (text) { | ||
return $sce.trustAsHtml( | ||
md.render(text || '') | ||
// Oh deer, what a hack :O | ||
.replace('<table', '<table class="table"') | ||
); | ||
}; | ||
}) | ||
.controller("lintList", function ($scope, $http) { | ||
// Level filter | ||
$scope.levels = {Allow: true, Warn: true, Deny: true, Deprecated: true}; | ||
$scope.byLevels = function (lint) { | ||
return $scope.levels[lint.level]; | ||
}; | ||
|
||
// Get data | ||
$scope.open = {}; | ||
$scope.loading = true; | ||
|
||
$http.get('./lints.json') | ||
.success(function (data) { | ||
$scope.data = data; | ||
$scope.loading = false; | ||
}) | ||
.error(function (data) { | ||
$scope.error = data; | ||
$scope.loading = false; | ||
}); | ||
}) | ||
})(); | ||
</script> | ||
</body> | ||
</html> |